如何在自定义 ModelBinder 中从body获取数据?

Ale*_*ler 6 c# asp.net-mvc model-binding asp.net-core

我正在 .NET Core 1.1(完整框架)应用程序中创建 IModelBinder 的自定义实现。

我有一个ActivityModel具有接口属性的类:

public class ActivityModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int Type { get; set; }
    public IActivityContent Content { get; set; }    // marker interface  
    //more unimportant props
}
Run Code Online (Sandbox Code Playgroud)

这个想法是客户端可以发送带有Content属性的对象,该属性可以是许多(当前为 8 个,但可能会增加)不同类之一。

通过这种方式,我们可以在 API 中拥有一个端点(针对每个 CRUD 操作)来处理所有这些不同类型的对象。

我正在实现一个 ModelBinder 来将从客户端发送的对象变成一个具体的类,这是我到目前为止所得到的:

    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }
        var content = bindingContext.ValueProvider.GetValue("content");

        return TaskCache.CompletedTask;
    }
Run Code Online (Sandbox Code Playgroud)

我目前只是试图将 Content 对象放入一个变量中,以便我可以更多地使用它,但 ValueProvider 只有 RouteValueProvider 和 QueryStringValueProvider。我如何在这里获取身体数据?

has*_*san 0

您可以在自定义模型绑定器中使用控制器上下文FormValueProvider并实现如下代码。

public Task BindModelAsync(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    if (bindingContext == null)
    {
        throw new ArgumentNullException(nameof(bindingContext));
    }

    bindingContext.ValueProvider = new FormValueProvider(controllerContext);
    ActivityModel model = (ActivityModel)bindingContext.Model ?? new ActivityModel();
    model.content = bindingContext.ValueProvider.GetValue("Content")

    return TaskCache.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)