3

我试图找出当前mvc6(visual studio 2015发布候选)中的模型绑定。 这是我的代码看起来像至今:mvc6自定义模型绑定器没有射击

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为空),但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) } 
    }); 
} 

回答

1

卸下动作的参数[FromBody]装饰。

FromBody指示将使用InputFormatter来填充此参数。如果你删除它模型粘合剂运行。

+0

如果我删除它,控制器不会再启动。但是,如果没有参数的话。我附加了用于测试的JavaScript,但实际情况是由外部软件调用,所以我无法更改它。 – Plaga

2

添加

public void ReceiveMyObject([ModelBinder(BinderType = typeof(MyObjectModelBinder))] MyObject x) 

到方法或U可以设置默认粘结剂类型

1

尝试将其添加为第一个模型绑定到列表中。 当IModelBinder成功设置模型时,其他IModelBinder不会被触发。

所以,如果你想给自己的机会IModelBinder你必须在其他人完成工作之前让它被解雇。

这个工作对我来说:

services.Configure<MvcOptions>(options => 
{ 
    options.ModelBinders.Insert(0, new MyObjectModelBinder()); 
}); 

但指数0不把它最好的地方。只需确定哪个ModelBinder设置了模型,并防止ModelBinder被触发并将ModelBinder放在它之前。