Как передать список целых чисел в действие MVC?

Могу ли я использовать List или что-то еще?

6 ответов

Скотт Гензельман имеет отличный учебник для этого здесь.


Вам нужно передать их в действие, добавив каждое целое число в ваш запрос POST или GET так:

******=1&******=4&******=6

Затем в вашем действии вы получите следующее действие

public ActionResult Blah(List<int> ******)
</int>

MVC затем заполнит список 1,4 и 6

Одна вещь, о которой нужно знать. Строка запроса НЕ МОЖЕТ содержать в них скобки. Иногда, когда формируются списки javascript, ваша строка запроса будет выглядеть так:

******[]=1&******[]=4&******[]=6

Это приведет к тому, что ваш список будет пустым (или будет иметь нуль). Скобки не должны быть там, где MVC правильно привязывает вашу модель.


Если вы пытаетесь отправить список из какого-либо элемента интерфейса (например, таблицы), вы можете просто установить свой атрибут имени в HTML: CollectionName [Index] например:

и

public ActionResult DoSomething(List<int> IntList) {
}
</int>

Параметр IntList wil получает список, содержащий 1 и 2 в этом порядке


Просто возьмите подходящую коллекцию. Точно, какой вид зависит от какой версии:

MVC1: public ActionResult DoSomething(int[] input) MVC2: public ActionResult DoSomething(IList<int> input)</int>


Использование:

[ArrayOrListParameterAttribute("ids", ",")]
public ActionResult Index(List<string> ids)
{
}
</string>

Здесь код для ArrayOrListParameterAttribute

using System;
using System.Web.Mvc;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
namespace MvcApplication1
{ public class ArrayOrListParameterAttribute : ActionFilterAttribute
{ #region Properties /// <summary> /// Gets or sets the name of the list or array parameter. /// </summary> /// <value>The name of the list or array parameter.</value> private string ListOrArrayParameterName { get; set; } /// <summary> /// Gets or sets the separator. /// </summary> /// <value>The separator.</value> private string Separator { get; set; } #endregion #region Constructors /// <summary> /// Initializes a new instance of the <see cref="ArrayOrListParameterAttribute"> class. /// </see></summary> /// Name of the list or array parameter. public ArrayOrListParameterAttribute(string listOrArrayParameterName) : this(listOrArrayParameterName, ",") { } /// <summary> /// Initializes a new instance of the <see cref="ArrayOrListParameterAttribute"> class. /// </see></summary> /// Name of the list or array parameter. /// The separator. public ArrayOrListParameterAttribute(string listOrArrayParameterName, string separator) { ListOrArrayParameterName = listOrArrayParameterName; Separator = separator; } #endregion #region Public Methods /// <summary> /// Called when [action executing]. /// </summary> /// The filter context. public override void OnActionExecuting(ActionExecutingContext filterContext) { string separatedValues = filterContext.RouteData.GetRequiredString(ListOrArrayParameterName); ParameterInfo[] parameters = filterContext.ActionMethod.GetParameters(); ParameterInfo searchedParameter = Array.Find(parameters, parameter => parameter.Name == ListOrArrayParameterName); if (searchedParameter == null) throw new InvalidOperationException(string.Format("Could not find Parameter '{0}' in action method '{1}'", ListOrArrayParameterName, filterContext.ActionMethod.Name)); Type arrayOrGenericListType = searchedParameter.ParameterType; if (!IsTypeArrayOrIList(arrayOrGenericListType)) throw new ArgumentException("arrayOrIListType is not an array or a type implementing Ilist or IList<>: " + arrayOrGenericListType); filterContext.ActionParameters[ListOrArrayParameterName] = GetArrayOrGenericListInstance(arrayOrGenericListType, separatedValues, Separator); base.OnActionExecuting(filterContext); } #endregion #region Non Public Methods private static bool IsTypeArrayOrIList(Type type) { if (type.IsArray) return true; return (Array.Exists(type.GetInterfaces(), x => x == typeof(IList) || x == typeof(IList<>))); } private static object GetArrayOrGenericListInstance(Type arrayOrIListType, string separatedValues, string separator) { if (separatedValues == null) return null; if (separator == null) throw new ArgumentNullException("separator"); if (arrayOrIListType.IsArray) { Type arrayElementType = arrayOrIListType.GetElementType(); ArrayList valueList = GetValueList(separatedValues, separator, arrayElementType); return valueList.ToArray(arrayElementType); } Type listElementType = GetListElementType(arrayOrIListType); if (listElementType != null) return GetGenericIListInstance(arrayOrIListType, GetValueList(separatedValues, separator, listElementType)); throw new InvalidOperationException("The type could not be handled, this should never happen: " + arrayOrIListType); } private static Type GetListElementType(Type genericListType) { Type listElementType = null; foreach (Type type in genericListType.GetInterfaces()) { if (type.IsGenericType && type == typeof(IList<>).MakeGenericType(type.GetGenericArguments()[0])) { listElementType = type.GetGenericArguments()[0]; break; } } return listElementType; } private static object GetGenericIListInstance(Type arrayOrIListType, ArrayList valueList) { object result = Activator.CreateInstance(arrayOrIListType); const BindingFlags flags = BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public; foreach (object value in valueList) { arrayOrIListType.InvokeMember("Add", flags, null, result, new[] { value }); } return result; } private static ArrayList GetValueList(string separatedValues, string separator, Type memberType) { string[] values = separatedValues.Split(new[] { separator }, StringSplitOptions.******************); ArrayList valueList = new ArrayList(); foreach (string value in values) { valueList.Add(Convert.ChangeType(value, memberType)); } return valueList; } #endregion
}

}


[ArrayOrListParameterAttribute("ids", ",")] public ActionResult Index(List<string> ids) { }
</string>

licensed under cc by-sa 3.0 with attribution.