首页 > 解决方案 > 为什么默认模型绑定器的行为不同?

问题描述

我正在创建具有以下 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.netasp.net-mvc-4model-bindingcustom-model-binder

解决方案


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

将属性更改为

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

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


推荐阅读