Как я могу принять массив в качестве ASP.NET параметр действия контроллера MVC?


у меня есть ASP.net контроллер MVC называется Designs это имеет действие со следующей подписью:

public ActionResult Multiple(int[] ids)

однако, когда я пытаюсь перейти к этому действию, используя url:

http://localhost:54119/Designs/Multiple?ids=24041,24117

The

4 65

4 ответа:

связыватель модели по умолчанию ожидает этот url:

http://localhost:54119/Designs/Multiple?ids=24041&ids=24117

для успешной привязки к:

public ActionResult Multiple(int[] ids)
{
    ...
}

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

public class IntArrayModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null || string.IsNullOrEmpty(value.AttemptedValue))
        {
            return null;
        }

        return value
            .AttemptedValue
            .Split(',')
            .Select(int.Parse)
            .ToArray();
    }
}

и затем вы можете применить эту модель привязки к конкретному аргументу действия:

public ActionResult Multiple([ModelBinder(typeof(IntArrayModelBinder))] int[] ids)
{
    ...
}

или применить его глобально ко всем целочисленным параметрам массива в вашем Application_Start на Global.asax:

ModelBinders.Binders.Add(typeof(int[]), new IntArrayModelBinder());

и теперь ваш действие контроллера может выглядеть так:

public ActionResult Multiple(int[] ids)
{
    ...
}

вы также можете использовать этот формат URL, и ASP.NET MVC сделает все за вас. Но, не забудьте применить кодировку URL.

?param1[0]=3344&param1[1]=2222

продлить на ответ Дарина Димитрова, то вы можете уйти с приема простой string в свой параметр URL и преобразование его в массив самостоятельно:

public ActionResult Multiple(string ids){
  int[] idsArray = ids.Split(',').Select(int.Parse).ToArray();
  /* ...process results... */
}

если вы получаете ошибку синтаксического анализа при этом (потому что кто-то передал вам искаженный массив), вы можете заставить ваш обработчик исключений возвращать 400 Bad Request ошибка вместо значения по умолчанию, более недружественный 404 Not Found ошибка, которую MVC возвращает, когда конечная точка не найдена.

Я не знаю, откуда исходила строка URL Groky, но у меня была такая же проблема с некоторыми javascript, вызывающими мой контроллер/действие. Он будет создавать URL-адрес null, 1 или много "идентификаторов" из списка множественного выбора (который уникален для решения, которое я собираюсь поделиться).

Я скопировал / вставил пользовательскую модель связующего Дарина и украсил мое действие/параметр, но это не сработало. У меня все еще есть null стоимостью int[] ids. Даже в" безопасном " случае, где у меня действительно было много идентификационная карточка.

Я закончил тем, что изменил javascript для создания ASP.NET MVC дружественный массив параметров, как

?ids=1&ids=2

Я должен был сделать некоторые глупые вещи, хотя

ids || []                 #=> if null, get an empty array
[ids || []]               #=> if a single item, wrap it in an array
[].concat.apply([], ...)  #=> in case I wrapped an array, flatten it

Итак, полный блок

ids = [].concat.apply([], [ids || []])
id_parameter = 'ids=' + ids.join('&ids=')

это грязно, но это первый раз, когда я должен был взломать, как это в javascript.