Как передать список целых чисел в действие 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.