【问题标题】:Why default Model binder behaving differently?为什么默认模型绑定器的行为不同?
【发布时间】:2018-07-31 08:07:32
【问题描述】:

我正在创建具有以下 url 的 API

/api/abc/?q=1&a=2&b=3&b=4
                  ^^^^^^^

Input.cs(ModelBinding 中使用的类)

...
public string A { get; set; }
public string B { get; set; }
public string Q { get; set; }
...

我正在使用 .NET 的默认 ModelBinding,但问题是当我通过上面的 url 时,以下值被分配给属性

obj.A = "2"   // here obj is object of Input class
obj.B = "3"
obj.Q = "1"

我期待 obj.B = "3,4"(当我执行 Request.QueryString["b"] 时,它的输出为 "3,4"),但它只绑定第一个值。

为什么会这样?(我不知道默认 ModelBinding 的内部结构,但我猜想它在某处使用 Request.QueryString 进行绑定)。

谁能告诉我为什么会这样?我怎样才能得到“3,4”作为 obj.B 值?

我为 B 获得“3,4”的方法是

使用自定义模型绑定器我已经完成以下操作

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    object model = base.BindModel(controllerContext, bindingContext);
    var obj = model as Input;
    obj.B = Request.QueryString["b"];
}

【问题讨论】:

    标签: c# asp.net asp.net-mvc-4 model-binding custom-model-binder


    【解决方案1】:

    您正在为B 发送多个值,这意味着您需要将B 设为一个集合。请注意,DefaultModelBinder 绑定第一个匹配的名称/值对,如果您的属性不是 IEnumerable,则忽略其余部分。

    将属性改为

    public IEnumerable<string> B { get; set; }
    

    它会包含两个值(如果你真的想要3,4,你可以在数组上使用String.Join)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2017-01-07
      • 2011-09-05
      • 2011-01-05
      • 2012-09-01
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多