我一直在尝试传递由以下函数创建的int数组:
function getCurrentSwimmerList() {
var swimmerList = [];
$("#swimmerTable > tbody > tr").each(function () {
swimmerList.push( parseInt($(this).data('swimmerid')) );
});
return swimmerList;
}
我在令牌输入中使用它来从搜索框中消除ceartin建议,所以我设置了令牌输入,如下所示:
$("#swimmerTokenInput").tokenInput("Admin/retrieveTokensForQuery", {
urlParams: { "IDsAlreadyAdded": getCurrentSwimmerList },
我修改了令牌输入文件,允许您通过设置urlParams
来传递请求中的其他参数,我对代码的添加是(在相应的部分中):
//add params passed in as urlParams
if (settings.urlParams != null) {
for (var key in settings.urlParams) {
if (settings.urlParams.hasOwnProperty(key)) {
ajax_params.data[key] = settings.urlParams[key];
}
}
}
我测试过,我在查询字符串中成功获取了这些值(其中Ol
已输入搜索框):
IDsAlreadyAdded=5%2C6&q=Ol
哪个chrome能够正确识别和解析:
IDsAlreadyAdded:5,6
q:Ol
我正在调用的方法的签名如下:
public JsonResult retrieveTokensForQuery(string q, int[] IDsAlreadyAdded)
每次q
成功获得适当的值,但IDsAlreadyAdded
总是获取空值。我已经查看了SO上的各种答案(尝试traditional=true
或IdsAlreadyAdded[] = ...
,List<int>
或IEnumerable<int>
)尝试解决问题,但我无法得到它工作。
非常感谢任何帮助。
答案 0 :(得分:1)
您总是可以创建一个自定义模型绑定器,将字符串值映射到int [],如下所示:
public class IntArrayModelBinder : System.Web.Mvc.DefaultModelBinder
{
public override object BindModel(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (!string.IsNullOrEmpty(valueProviderResult.AttemptedValue))
{
var items = valueProviderResult.AttemptedValue.Split(',');
var result = new int[items.Length];
for (var counter = 0; counter < items.Length; counter++)
{
result[counter] = int.Parse(items[counter]);
}
return result;
}
return base.BindModel(controllerContext, bindingContext);
}
}
然后在初始化路由时注册活页夹:
ModelBinders.Binders.Add(typeof(int[]), new IntArrayModelBinder());