3

我正在尝试找出当前 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 为空),但没有调用活页夹函数。关于这里有什么问题的任何想法?

[编辑:这已经更新]另外请注意,我已经看到在 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) }
    });
}
4

3 回答 3

2

添加

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

到方法,或者你可以为类型设置默认活页夹

于 2015-07-29T09:31:31.993 回答
1

移除[FromBody]操作参数上的装饰。

FromBody表示将InputFormatter使用 an 来填充此参数。如果您删除它模型活页夹运行。

于 2015-05-05T19:42:52.643 回答
1

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

所以如果你想给自己一个机会,IModelBinder你必须在别人做这份工作之前让它被解雇。

这对我有用:

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

但是索引0并不是放置它的最佳位置。只需确定哪个 ModelBinder 设置模型并防止您的 ModelBinder 被触发并将您的 ModelBinder 放在它之前。

于 2015-08-12T16:31:18.787 回答