从ajax调用(通过令牌输入)传递一组int到控制器

时间:2013-05-17 02:01:31

标签: c# asp.net-mvc jquery

我一直在尝试传递由以下函数创建的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=trueIdsAlreadyAdded[] = ...List<int>IEnumerable<int>)尝试解决问题,但我无法得到它工作。

非常感谢任何帮助。

1 个答案:

答案 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());