Подтвердить что ты не робот

Web Api Model Binding и полиморфное наследование

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

Например:

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 называется объектом, имеет значение null

4b9b3361

Ответ 1

Это возможно через привязку модели по умолчанию. проверьте ниже метод.

public abstract class RequestBase
{
    public int ID { get; set; }
}

public class MyRequest : RequestBase
{
    public string Name { get; set; }
}



[RoutePrefix("api/home")]
public class HomeController : ApiController
{
    [HttpPost]
    [Route("GetName")]
    public IHttpActionResult GetName([FromBody]MyRequest _request)
    {
        return Ok("Test");
    }
}

enter image description here