如何在MVC中发布复杂的结构

时间:2017-02-09 16:33:58

标签: c# asp.net-mvc actionresult html-form-post

如何通过表单提交将嵌套数据发布到ActionResult参数中? 我一直试图实现一个类似于this question答案的解决方案,但运气不好。

有关表格的部分结构如下:

<form method="post" action="/Product/Edit" class="tabs">
    <input name="Prices[1].Price" id="Prices_1__Price" value="9.99" type="text">
    <input name="Prices[1].Size2Price" id="Prices_1__Size2Price" value="0.00" type="text">
    <input name="Prices[1].Size3Price" id="Prices_1__Size3Price" value="0.00" type="text">
    <input name="Prices[2].Price" id="Prices_2__Price" value="5.00" type="text">
    <input name="Prices[2].Size2Price" id="Prices_2__Size2Price" value="0.00" type="text">
    <input name="Prices[2].Size3Price" id="Prices_2__Size3Price" value="0.00" type="text">
    <input name="Prices[3].Price" id="Prices_3__Price" value="0.00" type="text">
    <input name="Prices[3].Size2Price" id="Prices_3__Size2Price" value="0.00" type="text">
    <input name="Prices[3].Size3Price" id="Prices_3__Size3Price" value="0.00" type="text">
    <button type="submit">submit</button>
</form>

这在日志中很正常,发布的数据按预期显示:

Form Submission Event: (BaseController:57-ish): 
{
    ...
    "Prices[1].Price": "9.9900",
    "Prices[1].Size2Price": "0.0000",
    "Prices[1].Size3Price": "0.0000",
    "Prices[2].Price": "5.5800",
    "Prices[2].Size2Price": "0.0000",
    "Prices[2].Size3Price": "0.0000",
    "Prices[3].Price": "0.0000",
    "Prices[3].Size2Price": "0.0000",
    "Prices[3].Size3Price": "0.0000",
    ...
}

在模型中,我一直在尝试变种以试图捕捉价格的集合,目前的尝试如下:

[DataContract]
public class EditedProductEntry
{
    [DataContract]
    public struct PriceCollection
    {
        [DataMember( Name = "Price" )]
        public string Price { get; set; }
        [DataMember( Name = "Size2Price" )]
        public string Size2Price { get; set; }
        [DataMember( Name = "Size3Price" )]
        public string Size3Price { get; set; }
    }

    ...

    [DataMember( Name = "Prices" )]
    public PriceCollection[] Prices { get; set; }

    ...
}

在Controller端,我有“Edit”ActionResult,它接收“EditedProductEntry”数据结构:

[HttpPost]
[Route( "Edit", Name = "Product_Edit" )]
public ActionResult Edit( EditedProductEntry post )
{
    ...
}

我一直在摆弄“post”参数的结构,试图让它接受“价格”集合,但这让我很难过。剩下的数据正在通过精细和正在填充“EditedProductEntry”对象,但是该集合在保持为空时是坚定的。

我试过捕捉一个对象[],EditedProductEntry [],ICollection,IEnumerable&amp;我们也尝试将这些指定为“编辑”动作的附加参数,但到目前为止我还没有运气。

有没有人有其他想法?

1 个答案:

答案 0 :(得分:1)

我在本地计算机上尝试了相同的情况,并发现控件名称的索引不正确。

控件名称应该遵循基于零的索引,因此也应该发布正在发布的数据。

输入控件应声明如下。

<input name="Prices[0].Price" id="Prices_1__Price" value="9.99" type="text">
<input name="Prices[0].Size2Price" id="Prices_1__Size2Price" value="0.00" type="text">
<input name="Prices[0].Size3Price" id="Prices_1__Size3Price" value="0.00" type="text">
<input name="Prices[1].Price" id="Prices_2__Price" value="5.00" type="text">
<input name="Prices[1].Size2Price" id="Prices_2__Size2Price" value="0.00" type="text">
<input name="Prices[1].Size3Price" id="Prices_2__Size3Price" value="0.00" type="text">
<input name="Prices[2].Price" id="Prices_3__Price" value="0.00" type="text">
<input name="Prices[2].Size2Price" id="Prices_3__Size2Price" value="0.00" type="text">
<input name="Prices[2].Size3Price" id="Prices_3__Size3Price" value="0.00" type="text">

因此日志文件也会有以下数据。

"Prices[0].Price": "9.9900",
"Prices[0].Size2Price": "0.0000",
"Prices[0].Size3Price": "0.0000",
"Prices[1].Price": "5.5800",
"Prices[1].Size2Price": "0.0000",
"Prices[1].Size3Price": "0.0000",
"Prices[2].Price": "0.0000",
"Prices[2].Size2Price": "0.0000",
"Prices[2].Size3Price": "0.0000",

进行此更改可以解决您的问题。