Я пытался передать массив int, созданный следующей функцией:

function getCurrentSwimmerList() {
    var swimmerList = [];
    $("#swimmerTable >  tbody > tr").each(function () {
        swimmerList.push( parseInt($(this).data('swimmerid')) );
    });
    return swimmerList;
}

Что я использую при вводе токенов, чтобы исключить предложения сеартина из окна поиска, поэтому я настроил ввод токенов следующим образом:

$("#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

Какой хром правильно распознает и разбирает:

IDsAlreadyAdded:5,6
q:Ol

Сигнатура вызываемого мной метода выглядит следующим образом:

public JsonResult retrieveTokensForQuery(string q, int[] IDsAlreadyAdded)

Каждый раз, когда q успешно получает соответствующее значение, однако IDsAlreadyAdded всегда получает нулевое значение. Я просмотрел различные ответы на SO (пытаясь traditional=true или IdsAlreadyAdded[] = ..., имея List<int> или IEnumerable<int>), чтобы попытаться решить проблему, но я не мог этого понять работать.

Любая помощь будет принята с благодарностью.

0
HennyH 17 Май 2013 в 06:01

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());
1
boniestlawyer 17 Май 2013 в 08:10
Как мне зарегистрировать привязку модели к определенному маршруту?
 – 
HennyH
17 Май 2013 в 06:47
Связывания пользовательских моделей - это помощники сопоставления для MVC, когда MVC не может определить, как привязать конкретный тип. Каждый раз, когда MVC видит маршрут с параметром int [], он сначала пытается проанализировать значение, используя указанное выше настраиваемое связующее. Таким образом, это в основном связывает его для каждого маршрута с параметром int [].
 – 
boniestlawyer
17 Май 2013 в 06:55
Ваше решение работает отлично, мне пришлось немного его отредактировать, я изменил одну строку на result[counter] = int.Parse(items[counter]);, в противном случае массив был заполнен 0 по умолчанию. ваше здоровье :)
 – 
HennyH
17 Май 2013 в 07:07