Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在MVC中捕获复杂结构_C#_Asp.net Mvc_Actionresult_Forms_Http Post - Fatal编程技术网

C# 如何在MVC中捕获复杂结构

C# 如何在MVC中捕获复杂结构,c#,asp.net-mvc,actionresult,forms,http-post,C#,Asp.net Mvc,Actionresult,Forms,Http Post,如何通过表单提交将嵌套数据发布到ActionResult参数中? 我一直在尝试实现一个类似于的解决方案,但运气不太好 所述表格的部分结构如下: <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

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

所述表格的部分结构如下:

<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>
[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; }

    ...
}
在这个模型中,我一直在尝试各种变化,试图捕捉价格集合,目前的尝试如下:

<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>
[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; }

    ...
}
在控制器端,我有一个Edit ActionResult,它接收EditedProductEntry数据结构:

[HttpPost]
[Route( "Edit", Name = "Product_Edit" )]
public ActionResult Edit( EditedProductEntry post )
{
    ...
}
我一直在摆弄post参数的结构,试图让它接受Prices集合,但这让我很为难。其余的数据通过fine&填充EditedProductEntry对象,但是集合仍然保持null

我曾尝试捕捉对象[]、EditedProductEntry[]、ICollection、IEnumerable&也曾尝试将它们指定为编辑操作的附加参数,但到目前为止,我没有任何运气


有人有其他想法吗?

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

控件名应该跟在从零开始的索引后面,因此也应该跟在正在发布的数据后面

输入控件应声明如下

<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">

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

从0开始索引,而不是从1开始,或者对模型绑定集合使用非顺序索引绑定-。我建议第二种方法DataContract和DataMember属性不是必需的,可能应该使用,这只是给代码增加了噪音。手动生成输入是疯狂的。如果它们是现有项目,请参考,如果您在W视图中动态添加/删除项目,请参考@Developer,您应该将其作为答案发布。你和契坦是对的。谢谢大家。但我强烈建议你们研究一下绑定集合的非顺序索引。正如@StephenMuecke所说的,尽量不要手动生成。啊,感谢所有回答的人。关于索引,你是对的,我是愚蠢的&使用价格级别的ID作为索引,而不是将其作为隐藏字段传递给PriceCollection对象。