繁体   English   中英

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

[英]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="[&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) => ...

当我调试上面的代码时,我的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="[&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您期望的那样转换为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检索值,然后将其转换为数组并将其提交给控制器,这也将起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM