如何从自定义 ModelBinder 中的正文获取数据?

Posted

技术标签:

【中文标题】如何从自定义 ModelBinder 中的正文获取数据?【英文标题】:How to get data frombody in a custom ModelBinder? 【发布时间】:2018-01-24 19:22:51 【问题描述】:

我正在 .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。我如何在这里获取身体数据?

【问题讨论】:

您也可以在自定义模型绑定器中使用 FormValueProvider 和 HttpFileCollectionValueProvider,在您的情况下,您可以使用 FormValueProvider 获取正文数据并填写内容字段 【参考方案1】:

您可以在自定义模型绑定器中使用带有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;

【讨论】:

以上是关于如何从自定义 ModelBinder 中的正文获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

列表视图中的页脚按钮,如何从自定义列表适配器中获取值

如何从自定义用户控件 WPF、C# 中的枚举自定义属性中获取值?

Wordpress ACF 字段如何从自定义帖子类型中获取选项

如何从自定义弹出菜单扩展中的选择事件中获取所选对象值?

从自定义单元格 iPhone 中的 textField 获取值

从自定义授权方 Lambda 函数访问 POST 请求正文