ASP.NET MVC参数绑定:如何将列表或数组POST到控制器方法



我似乎不知道如何通过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="[&quot;8cd52539-c371-402a-b8be-12775f03ab68&quot;,&quot;8c97f9e0-666c-41ba-a914-72815745d1f0&quot;]">
<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="[&quot;f8b21933-419c-4bdd-b5b6-75295ff65612&quot;,&quot;67bb1d75-ae78-49e4-bc29-ee82a51bb9a1&quot;]">
<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="[&quot;f8b21933-419c-4bdd-b5b6-75295ff65612&quot;,&quot;67bb1d75-ae78-49e4-bc29-ee82a51bb9a1&quot;]">
@{
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中检索值,然后将其转换为数组并提交给控制器,这也可以。

最新更新