【问题标题】:mvc6 custom model binder not firingmvc6自定义模型绑定器未触发
【发布时间】:2015-05-05 19:24:13
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    添加

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

    到方法或者你可以为类型设置默认绑定

    【讨论】:

      【解决方案2】:

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

      FromBody 表示InputFormatter 将用于填充此参数。如果你删除它,模型绑定器就会运行。

      【讨论】:

      • 如果我删除它,控制器将不再触发。但是,如果没有参数,它会这样做。我附上了我用于测试的 javascript,但在实际情况下,调用是由外部软件进行的,所以我无法更改它。
      【解决方案3】:

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

      因此,如果您想给自己的IModelBinder 一个机会,您必须在其他人完成这项工作之前让它被解雇。

      这对我有用:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 2017-04-19
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        相关资源
        最近更新 更多