我如何接受一个数组作为ASP.NET MVC控制器的操作参数?
我有一个名为devise的ASP.net MVC控制器,具有以下签名的操作:
public ActionResult Multiple(int[] ids)
但是,当我尝试使用url导航到此操作时:
http://localhost:54119/Designs/Multiple?ids=24041,24117
ids参数始终为空。 有没有什么办法让MVC转换ids = URL查询参数为一个数组的行动? 我已经看到使用动作filter的谈话,但据我所知,只会在数组传递到请求数据而不是URL本身的POST中。
默认模型联编程序需要这个URL:
http://localhost:54119/Designs/Multiple?ids=24041&ids=24117
为了成功绑定到:
public ActionResult Multiple(int[] ids) { ... }
如果你想用逗号分隔的值工作,你可以写一个自定义的模型绑定器:
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) { ... }
或者将其全局应用于Global.asax
的Application_Start
中的所有整数数组参数:
ModelBinders.Binders.Add(typeof(int[]), new IntArrayModelBinder());
现在你的控制器动作可能看起来像这样:
public ActionResult Multiple(int[] ids) { ... }
你也可以使用这个URL格式,ASP.NET MVC将为你做所有事情。 但是,请记住应用URL编码。
?param1[0]=3344¶m1[1]=2222
为了扩展Darin Dimitrov的答案 ,你可以避开的一个问题就是在你的URL参数中接受一个简单的string
,并将它自己转换为一个数组:
public ActionResult Multiple(string ids){ int[] idsArray = ids.Split(',').Select(int.Parse).ToArray(); /* ...process results... */ }
如果在执行此操作时(因为有人向您传递了格式错误的数组),您可能会导致您的exception处理程序返回400 Bad Request
错误,而不是默认的,更不友好的404 Not Found
错误,未find。
我不知道Groky的URLstring来自哪里,但是我有一些JavaScript调用我的控制器/操作的问题。 它将从多选列表(这是我将要共享的解决scheme所特有的)中build立一个null
,1或多个“ID”的URL。
我复制/粘贴达林的自定义模型联编程序,并装饰我的行动/参数,但它没有工作。 我仍然得到了null
值int[] ids
。 即使在我确实有很多ID的“安全”情况下,
我结束了改变的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这样的黑客入侵。
- ASP.NET MVC Editor-Templates / UIHint带参数
- 500.19 – 内部服务器错误 – 所请求的页面无法访问,因为页面的相关configuration数据无效
- 返回新的EmptyResult()VS返回NULL
- 在TextBoxFor中限制为2个小数
- 如何使用MVC3 Razor从Viewbag呈现HTML
- ASP.NET MVC 3 Razorrecursion函数
- 如何在mvc3中更改razorLabelFor的显示名称?
- IIS上的ASP.NET MVC3和Windows身份validation会一直redirect到/ Account / Login
- 正确的方式来使用jQuery中的AJAX Post从强types的MVC3视图传递模型