[英]ASP.NET MVC parameter binding: How to POST a list or array to a controller method?
我似乎无法弄清楚如何通过POST将GUID数组作为参数传递给ASP.NET MVC控制器。 我想念什么? 有没有更简单的方法可以做到这一点?
在我的AngularJS标记中:
<form method="post" action="/Foo/Bar" >
<input name="itemIds" type="hidden" value="{{ ctrl.itemIds }}">
<button type="submit">Submit</button>
</form>
产生HTML:
<form method="post" action="/Foo/Bar" >
<input name="itemIds" type="hidden" value="["8cd52539-c371-402a-b8be-12775f03ab68","8c97f9e0-666c-41ba-a914-72815745d1f0"]">
<button type="submit">Submit</button>
</form>
在我的FooController中:
[System.Web.Mvc.HttpPost]
public ActionResult Bar([FromBody]Guid[] itemIds) => ...
当我调试上面的代码时,我的HTTP POST似乎是正确的,但是在Bar
得到了null itemIds
。 您能帮我改变它的工作方式吗? 鉴于我的JS模型中已经有一个GUID数组,是否有更好的方法填充请求正文?
这是真正发生的事情:
itemIds
作为单个字符串发布到控制器。 为什么? 因为itemIds
不会解释为数组。 如果需要数组,则需要具有多个名为itemIds[0]
和itemsIds[1]
等的隐藏值。 这是一个快速测试,可以证明我所说的实际上是正在发生的事情:
创建这样的表单。 看到我们创建了一个名为itemIdsOld
隐藏值,然后再创建了两个名为itemIds[0]
和itemIds[1]
隐藏值:
<form method="post" action="/Foo/Bar">
<input name="itemIdsOld" type="hidden" value="["f8b21933-419c-4bdd-b5b6-75295ff65612","67bb1d75-ae78-49e4-bc29-ee82a51bb9a1"]">
<input name="itemIds[0]" type="hidden" value="f8b21933-419c-4bdd-b5b6-75295ff65612">
<input name="itemIds[1]" type="hidden" value="67bb1d75-ae78-49e4-bc29-ee82a51bb9a1">
<button type="submit">Submit</button>
</form>
创建一个像这样的控制器:
[System.Web.Mvc.HttpPost]
public ActionResult Index(string[] itemIdsOld, Guid[] itemIds)
{
return null;
}
发布上述表单时,您会注意到在itemIdsOld
创建了一个字符串,并且其中的两个Guid都是string
。 但是,由于我们创建了名为itemIds[0]
和itemIds[1]
控件,因此第二个控件Guid[] itemIds
您期望的那样转换为Guid[] itemIds
。
我不确定如何在Angular中执行此操作,但是使用C#和Razor,执行此操作的一种方法如下:
@using System.Collections.Generic
@{
var guids = new List<Guid> { Guid.NewGuid(), Guid.NewGuid() };
}
<form method="post" action="/Test/Index">
<input name="itemIdsOld" type="hidden" value="["f8b21933-419c-4bdd-b5b6-75295ff65612","67bb1d75-ae78-49e4-bc29-ee82a51bb9a1"]">
@{
for (int i = 0; i < guids.Count; i++)
{
<input name="itemIds[@i]" type="hidden" value="@guids[i]">
}
}
<button type="submit">Submit</button>
</form>
我对指南进行了硬编码,但是您可以从模型中获得它...您明白了。
或者,您可以使用Javascript截获表单提交,并从itemIds
检索值,然后将其转换为数组并将其提交给控制器,这也将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.