如何从自定义 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 字段如何从自定义帖子类型中获取选项