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