2013-06-24 4 views
13

Я спрашиваю, знает ли кто-нибудь, можно ли передать в Web Api конкретный класс, который наследуется от абстрактного класса.Web Api Model Binding and Polymorphic Inheritance

Например:

public abstract class A{ 
    A(); 
} 

public class B : A{ 

} 

[POST("api/Request/{a}")] 
public class Request(A a) 
{ 
} 

В настоящее время я смотрел вокруг и большинство решений, кажется, говорят, что использование TypeNameHandling будет работать.

JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); 
      jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; 

Однако это не тот случай. Также моя модель передается из консольного приложения в webapi. Я прочитал, что я могу десериализовать объект json, и после нескольких попыток я решил, что это не сработает.

Однако я искал создание связующего устройства для клиентов, но не хочу, чтобы мое приложение было более сложным, чем оно должно быть. В настоящее время я унаследовал от абстрактного класса 3 модели, но в будущем это может расширить. Как вы можете заметить, добавление пользовательских привязок моделей может потребовать нескольких связующих, если не существует способа сделать одно связующее общим для всех типов абстрактного класса.

Чтобы расширить это в моей консоли приложение, которое я экземпляр класса B в качестве таковых, а затем передал его ObjectContent, прежде чем отправлять на мой WebAPI

item = B(); 

//serialize and post to web api 
MediaTypeFormatter formatter; 
JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); 
jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; 
formatter = jsonFormatter; 

_content = new ObjectContent<A>(item, formatter); 
var response = _client.PostAsync("api/Request", _content).Result; 

, когда действие WebAPI называется объект является нулевым

+0

Вы можете, вероятно, посмотрите на мой ответ по поводу наследования и modelbinding здесь: http://stackoverflow.com/a/15518804/1184056 –

+0

выглядит также, как в следующем выпуске в Json.NET была зафиксирована в марте этого года. Вероятно, попробуйте получить последнюю версию Json.net и посмотрите, все ли повторяется ваша проблема: http://json.codeplex.com/workitem/23891 –

+2

Я изучил это дальше и ответил на мой собственный вопрос. Вы не можете передать абстрактный класс с помощью привязки к модели, поскольку вы не можете создать экземпляр класса, который является абстрактным. Единственный способ обойти эту проблему - сделать базу не абстрактной, так как привязка к модели работает отлично. –

ответ

0

Как отметил LiamK, его решение не будет работать в WebAPI. WebAPI использует интерфейс IModelBinder для привязки, и ModelMetadataProviders не будет существовать для этих моделей.

Здесь я нашел решение этой проблемы;

WebAPI Custom Model binding of complex abstract object