Web Api模型绑定和多态继承

Ian*_*rds 20 c# json json.net asp.net-web-api

我问是否有人知道是否有可能将一个继承自抽象类的具体类传递给Web Api.

例如:

public abstract class A{
    A();
}

public class B : A{

}

[POST("api/Request/{a}")]
public class Request(A a)
{
}
Run Code Online (Sandbox Code Playgroud)

目前我已经环顾四周,大多数解决方案似乎都说使用TypeNameHandling会起作用.

JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();
            jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
Run Code Online (Sandbox Code Playgroud)

然而,事实并非如此.我的模型也从控制台应用程序传递到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;
Run Code Online (Sandbox Code Playgroud)

调用webapi操作时,对象为null

小智 -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");
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我猜这不是Ian的本意,他想使用基类(而不是派生类)作为api方法接受的类型。 (2认同)