C# 为什么默认模型绑定器的行为不同?
我正在创建API,其中包含以下urlC# 为什么默认模型绑定器的行为不同?,c#,asp.net,asp.net-mvc-4,model-binding,custom-model-binder,C#,Asp.net,Asp.net Mvc 4,Model Binding,Custom Model Binder,我正在创建API,其中包含以下url /api/abc/?q=1&a=2&b=3&b=4 ^^^^^^^ Input.cs(模型绑定中使用的类) 我使用的是.NET的默认ModelBinding,但问题是当我传递上述url时,会将以下值分配给属性 obj.A = "2" // here obj is object of Input class obj.B = "3" obj.Q = "1" 我期望obj.B=“3,4”(当我执行
/api/abc/?q=1&a=2&b=3&b=4
^^^^^^^
Input.cs(模型绑定中使用的类)
我使用的是.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"];
}
您正在为
B
发送多个值,这意味着您需要创建B
集合。注意DefaultModelBinder
绑定第一个匹配的名称/值对,如果属性不是IEnumerable
,则忽略其余部分
将属性更改为
public IEnumerable<string> B { get; set; }
公共IEnumerable B{get;set;}
它将包含这两个值(如果您确实想要3,4
,可以在数组上使用String.Join
)
public IEnumerable<string> B { get; set; }