RemoteAttribute没有正确地将查询字符串作为IEnumerable 传递

假设我有一个像这样的ViewModel:

public class Foo { public int Id { get; set; } public IEnumerable AvailableBars { get; set; } /* For populating DropDownList */ [Remote("CheckIds", "Baz", AdditionalFields = "Id")] public IEnumerable BarIds { get; set; } } 

和这样的控制器:

 public class BazController { // ...CRUD operations skipped public ActionResult CheckIds(int id, IEnumerable barIds) { bool isValid = /* Logic for checking validity */ if (!isValid) { return Json("Error", JsonRequestBehavior.AllowGet); } return Json(true, JsonRequestBehavior.AllowGet); } } 

在我看来:

 @Html.DropDownListFor(model => model.BarIds, Model.AvailableBars, new { multiple = "multiple" }) 

问题是当我尝试触发validation时,实际的HTTP GET请求变为:

 http://localhost:8080/Baz/CheckIds?id=4&barIds=7%2C8 /* <-- barIds=7,8 */ 

代替:

 http://localhost:8080/Baz/CheckIds?id=4&barIds=7&barIds=8 

默认模型绑定器无法将int绑定到IEnumerable 。 我该如何解决这个问题?

jquery.validate和jquery.validate.unobstrusive不处理数组。 如果确实需要处理数组,则需要修改它们。

我能想到的最短的解决方案:

1)将jquery.validateremote函数中的$.ajax调用修改为this

 var ajaxOptions = $.extend(true, { url: param, mode: "abort", port: "validate" + element.name, dataType: "json", data: data, success: function (response) { ... } }, param); //Fix the bug //we are not supposed to pass functions to data parameter //capture the function output so array values are //serialized properly $.each(ajaxOptions.data, function (key, value) { if ($.isFunction(value)) { ajaxOptions.data[key] = value(); } }); $.ajax(ajaxOptions); 

2)将traditional: true添加到jquery.validate.unobstrusiveremote适配器

 var value = { url: options.params.url, type: options.params.type || "GET", data: {}, traditional: true //so that MVC is able to de-serialize arrays }