自定义POST数据绑定,根据值选择类型

时间:2018-11-06 13:38:15

标签: c# asp.net-core asp.net-core-mvc model-binding

我正在使用Asp.NET MVC Core 2来实现REST WebAPI。在我的控制器中,我有一个方法可以接受POST请求,如下所示:

[HttpPost("Configuration")]
public IActionResult Configuration([FromBody] BridgeConfiguration data)
{
    ...
}

这有效,但是问题在于您在方法签名中看到的BridgeConfiguration类是基类,而我想做的实际上是基于一个基类选择一个合适的派生类进行绑定传入对象中的值。

我已经阅读到可以使用自定义模型绑定程序来完成此操作,但是我在实现它时遇到了麻烦。我所做的是:我将控制器方法更改为:

[HttpPost("Configuration")]
public IActionResult Configuration([ModelBinder(typeof(BridgeConfigurationModelBinder))] BridgeConfiguration data)
{
    ...
}

并尝试实现模型绑定器:

public class BridgeConfigurationModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var nameProp = bindingContext.ModelMetadata.Properties["name"]; //Exists and contains all the proper info :)
        var nameVal = bindingContext.ValueProvider.GetValue("name"); //Returns empty value :(

        //how do I get the value of the "name" field???

        return Task.CompletedTask;
    }
}

我遇到的问题是,正如您从注释中看到的那样,即使在元数据中我要查找的字段已正确定义,但其值却没有。 ValueProvider始终返回空。

我在这里做什么错了?

如果有什么用,我的帖子请求的正文是这样的:

{
    name: "somename",
    foo: "bar",
    ...
}

没什么奇怪的,只是一个简单的JSON。

0 个答案:

没有答案