Załóżmy, że mam model:Jak odpowiedzieć w ASP.NET Web API z modelu własności jako interfejs
public class Menu
{
public string Name { get; set; }
public IMenuCommand Next { get; set; }
}
IMenuCommand
mogą mieć różne implementacje, jak:
public class NextStepCommand : IMenuCommand
{
public int Step { get; set; }
}
public class VoiceCommand : IMenuCommand
{
public string Message { get; set; }
}
I chcę POST menu z różnymi poleceniami do usługi ASP.NET Web API. Jak mogę to zrobić?
Żądanie poniżej utworzyć obiekt z określonym Name
, ale komenda Next
będzie null:
POST http://localhost/api/menus: {"name":"bob","next":{"step":1}}
Returns 201: {"Name":"bob","Next":null}
Domyślnie Web API spoiwa nie można odwzorować moją prośbę params do potrzebnej C# typu - oczywiście jest to trudna część. Czy mogę użyć atrybutu "znanego typu" dla właściwości opartych na interfejsie, czy istnieje inne podejście do obsługi tego przypadku, prawdopodobnie niestandardowy model spoiwa?
pracował dla mnie kiedy ustawić 'TypeNameHandling .Auto' for Web Serial JSON serializer i wysłał żądanie z potrzebnym "$ type" polecenia. Ale czy mogę włączyć funkcję 'TypeNameHandling' tylko do deserializacji? Ponieważ teraz mam zbyt dużo śmieci w wynikach JSON w usługach GET. – whyleee
Ustalono, że możliwe jest użycie '[JsonProperty (TypeNameHandling = TypeNameHandling.All)]' dla określonych właściwości modelu (od [blog Json.NET] (http://james.newtonking.com/archive/2010/08/13/ json-net-3-5-release-8-3-5-final.aspx)). Sprawdzono za pomocą Web API - działa. Znacznie lepiej teraz. – whyleee
@Youssef Moussaoui - Wszelkie pomysły na to pytanie: http://stackoverflow.com/questions/20252027/json-net-web-api-serialization-with-derrived-inherited-types ... Nie mając szczęścia z niczym! – amcdnl