Как я могу принять массив в качестве ASP.NET параметр действия контроллера MVC?
у меня есть ASP.net контроллер MVC называется Designs это имеет действие со следующей подписью:
public ActionResult Multiple(int[] ids)
однако, когда я пытаюсь перейти к этому действию, используя url:
http://localhost:54119/Designs/Multiple?ids=24041,24117
The
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¶m1[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.