我有一个名为Designs
的ASP.net MVC控制器,其操作具有以下签名:
public ActionResult Multiple(int[] ids)
但是,当我尝试使用url导航到此操作时:
http://localhost:54119/Designs/Multiple?ids=24041,24117
ids
参数始终为null。有没有办法让MVC将?ids=
URL查询参数转换为动作数组?我已经看到过使用动作过滤器的说法,但据我所知,这只适用于在请求数据中而不是在URL本身中传递数组的POST。
答案 0 :(得分:133)
默认模型绑定器需要此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)
{
...
}
或全局应用于Application_Start
Global.asax
中ModelBinders.Binders.Add(typeof(int[]), new IntArrayModelBinder());
的所有整数数组参数:
public ActionResult Multiple(int[] ids)
{
...
}
现在您的控制器操作可能如下所示:
{{1}}
答案 1 :(得分:12)
要延伸Darin Dimitrov's answer,您可以通过URL参数接受一个简单的string
并自行将其转换为数组:
public ActionResult Multiple(string ids){
int[] idsArray = ids.Split(',').Select(int.Parse).ToArray();
/* ...process results... */
}
如果在执行此操作时遇到解析错误(因为有人向您传递了格式错误的数组),您可能会导致异常处理程序返回400 Bad Request
错误,而不是默认的,更不友好的404 Not Found
错误当找不到端点时MVC返回。
答案 2 :(得分:9)
您也可以使用此URL格式,ASP.NET MVC将为您完成所有操作。但是,请记住应用URL编码。
?param1[0]=3344¶m1[1]=2222
答案 3 :(得分:5)
我不知道Groky的URL字符串来自哪里,但我遇到了一些调用我的控制器/操作的javascript问题。它会从多选列表中构建一个null
,1或多个“ID”的URL(这是我要分享的解决方案所独有的)。
我复制/粘贴了Darin的自定义模型活页夹并装饰了我的动作/参数,但它没有用。我的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中破解这样的东西。
答案 4 :(得分:1)
.Net Core答案
对于最近来这里的人,可以在.Net Core中执行以下操作:
http://localhost:54119/Designs/Multiple?ids=24041&ids=24117
和:
public ActionResult Multiple([FromQuery] int[] ids)
{
...
}