为什么默认模型联编程序的行为有所不同?

时间:2018-07-31 08:07:33

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

我正在创建具有以下网址的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进行绑定的。)

谁能告诉我为什么会这样,如何获得obj.B值“ 3,4”?

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

使用自定义Model Binder,我已经完成了

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

1 个答案:

答案 0 :(得分:2)

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

将属性更改为

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

,它将包含两个值(如果您随后确实想要3,4,则可以在数组上使用String.Join)。