我可以使用List或其他东西吗?如何将整数列表传递给MVC操作?
回答
Scott Hanselman在这样做here.
Phil Haack有一个更新的版本,下载项目。 http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx – 2010-08-11 12:26:27
只要采取正确的类集合的优秀教程。究竟哪种类型取决于哪一个版本:
MVC1:public ActionResult DoSomething(int[] input)
MVC2:public ActionResult DoSomething(IList<int> input)
您可以将一个'List
[ArrayOrListParameterAttribute("ids", ",")]
public ActionResult Index(List<string> ids)
{
}
没有这样的属性。不在.NET中,并且使用Google搜索,没有发现任何源代码。 – AaronLS 2013-05-29 19:41:52
您需要通过添加到您的POST每个整数将它们传递给你的行动或GET查询字符串,像这样:
myints=1&myints=4&myints=6
然后在你的行动,你将有以下作用
public ActionResult Blah(List<int> myints)
MVC然后将填充列表1,4和6
有一点要注意。你的查询字符串不能有括号。有时,当形成的JavaScript列出您的查询字符串会是这样的:
myints[]=1&myints[]=4&myints[]=6
这将导致您的列表为空(或具有计数为零)。括号不能在MVC中正确绑定模型。
如果你正试图从一些界面项(如,表)发送列表,你可以设置在HTML的name属性:集合名[索引] 例如:
<input id="IntList_0_" name="IntList[0]" type="text" value="1" />
<input id="IntList_1_" name="IntList[1]" type="text" value="2" />
和
public ActionResult DoSomething(List<int> IntList) {
}
的intList中参数港岛线接收的顺序
使用含有1和2的列表:
[ArrayOrListParameterAttribute("ids", ",")]
public ActionResult Index(List<string> ids)
{
}
这里的代码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.
/// </summary>
/// <param name="listOrArrayParameterName">Name of the list or array parameter.</param>
public ArrayOrListParameterAttribute(string listOrArrayParameterName) : this(listOrArrayParameterName, ",")
{
}
/// <summary>
/// Initializes a new instance of the <see cref="ArrayOrListParameterAttribute"/> class.
/// </summary>
/// <param name="listOrArrayParameterName">Name of the list or array parameter.</param>
/// <param name="separator">The separator.</param>
public ArrayOrListParameterAttribute(string listOrArrayParameterName, string separator)
{
ListOrArrayParameterName = listOrArrayParameterName;
Separator = separator;
}
#endregion
#region Public Methods
/// <summary>
/// Called when [action executing].
/// </summary>
/// <param name="filterContext">The filter context.</param>
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.RemoveEmptyEntries);
ArrayList valueList = new ArrayList();
foreach (string value in values)
{
valueList.Add(Convert.ChangeType(value, memberType));
}
return valueList;
}
#endregion
}
}
- 1. 如何将整数列表传递给MVC操作?
- 2. 如何将JSON对象传递给MVC操作参数?
- 3. 将整数列表传递给python
- 4. 如何将对象列表传递给使用jQuery的ASP.NET MVC操作?
- 5. ASP.NET MVC 2如何将JSON传递给ASP.NET控制器操作
- 6. 将操作符传递给函数?
- 7. 将整数传递给BaseAdapter
- 8. 如何将列表作为参数传递给对话框?
- 9. 如何将列表作为参数传递给nunit控制台
- 10. ASP.Net MVC:应该如何将查询字符串参数传递给子操作?
- 11. 如何使用$ .ajax将多个数组传递给ASP.NET MVC操作?
- 12. 如何将mysql_insert_id()传递给$ _POST或表单操作?
- 13. 如何将HashMap值传递给列表
- 14. 如何将视图中的列表传递给MVC控制器
- 15. Kendo Grid将表单数据作为参数传递给MVC
- 16. 如何使用FluidTypo3将参数传递给控制器操作?
- 17. 如何将数字传递给手势识别器操作?
- 18. 如何将参数传递给登录操作?
- 19. 如何将参数传递给操作方法
- 20. 如何在执行操作后将参数传递给h:commandLink?
- 21. 如何将表单传递给过程作为参数并操作其属性?
- 22. 如何将url作为字符串参数传递给表单发布操作
- 23. 将列表传递给类
- 24. 如何将Oozie配置传递给工作流操作,如Hive?
- 25. 将视图/ Javascript中的对象传递给MVC操作
- 26. 如何将数据表传递给Mysql
- 27. 如何将整数值传递给其他表单?
- 28. 将列表传递给params参数
- 29. 将列表传递给一个函数
- 30. 将参数列表传递给Auto.Arima
你是如何打算通过列表?从客户端调用(javascript)还是从查看页面? – MilkyWayJoe 2010-08-10 15:56:40
对于我在本网站上看到的最短问题+1。 :) – Kye 2012-11-27 02:16:01