mvc6自定义模型绑定器没有触发

时间:2015-05-05 19:24:13

标签: model-binding asp.net-core asp.net-core-mvc custom-model-binder imodelbinder

我正在尝试在当前的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) }
    });
}

3 个答案:

答案 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放在它之前。