我似乎不知道如何通过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) => ...
当我调试以上内容时,我的HTTPPOST似乎是正确的,但我在Bar
中得到了空itemIds
。你能帮我把这个改成工作吗?考虑到我的JS模型中已经有一组GUID,有没有更好的方法来填充我的请求体?
以下是实际情况:
CCD_ 3作为一个单独的字符串被发布到控制器。为什么?因为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
。
我不知道如何在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
中检索值,然后将其转换为数组并提交给控制器,这也可以。