我正在尝试在当前的mvc6(visual studio 2015发布候选版)中找出模型绑定。 这是我的代码到目前为止的样子:
public class MyObjectModelBinder : IModelBinder
{
public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(MyObject))
{
var model = new MyObject();
return Task.FromResult(new ModelBindingResult(model, bindingContext.ModelName, true));
}
return Task.FromResult<ModelBindingResult>(null);
}
}
在startup.cs中注册
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().Configure<MvcOptions>(options =>
{
options.ModelBinders.Add(typeof( MyObjectModelBinder));
});
}
我的控制器:
[HttpPost]
public void ReceiveMyObject([FromBody] MyObject x)
{
}
我还不关心从输入中实际创建对象,让我感到困扰的是,当我调试时,我看到控制器触发(x为null),但是没有调用binder函数。 这里有什么问题吗?
[编辑:这已经更新]另请注意,我已经看过What is the correct way to create custom model binders in MVC6?但该帖子的答案是错误的或过时的,因为提供的示例没有实现当前的IModelBinder。
由于
编辑:这是用于触发控制器的javascript代码:
function sendMessage(i) {
$.ajax({
type: 'POST',
url: 'myurl',
data: data,
contentType: 'application/x-www-form-urlencoded',
dataType: 'json',
success: function (data) { console.log(data) }
});
}
答案 0 :(得分:2)
添加
public void ReceiveMyObject([ModelBinder(BinderType = typeof(MyObjectModelBinder))] MyObject x)
to method或u可以为类型
设置默认绑定器答案 1 :(得分:1)
删除操作参数上的[FromBody]
装饰。
FromBody
表示将InputFormatter
用于填充此参数。如果你删除模型粘合剂运行。
答案 2 :(得分:1)
尝试将其作为第一个模型绑定器添加到列表中。
当IModelBinder
成功设置模型后,其他IModelBinder
将被解雇。
因此,如果你想给自己的IModelBinder
机会,你必须在其他人完成工作之前将其解雇。
这对我有用:
services.Configure<MvcOptions>(options =>
{
options.ModelBinders.Insert(0, new MyObjectModelBinder());
});
但索引0
并不是最好的选择。只需确定哪个ModelBinder设置模型并阻止模型绑定器被触发并将ModelBinder放在它之前。