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

时间:2017-08-16 15:04:27

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

我在.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
}

这个想法是客户端可以使用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;
    }

我目前只是尝试将Content对象变为变量,因此我可以更多地使用它,但ValueProvider只有RouteValueProvider和QueryStringValueProvider。我如何在这里获取身体数据?

1 个答案:

答案 0 :(得分: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;
}