我正在尝试找出当前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),但是粘合剂函数并未被调用。对这里有什么问题的想法?
[edit:已经更新了这一点]还请注意,我已经看到了在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) }
});
}
add
public void ReceiveMyObject([ModelBinder(BinderType = typeof(MyObjectModelBinder))] MyObject x)
to方法或您可以设置类型
删除动作参数上的[FromBody]
装饰。
FromBody
指示InputFormatter
应用于填充此参数。如果将其删除,则运行型号。
尝试将其作为第一个模型活页夹添加到列表中。当IModelBinder
成功设置型号时,其他IModelBinder
不会触发。
因此,如果您想给自己的IModelBinder
机会,您必须在其他人完成工作之前将其解雇。
这对我有用:
services.Configure<MvcOptions>(options =>
{
options.ModelBinders.Insert(0, new MyObjectModelBinder());
});
但索引0
并不是提出它的最佳场所。只需确定哪种模型迎合器设置模型并防止您的模型燃烧器被触发并将模型放在之前。