C# 如何在MVC中捕获复杂结构
如何通过表单提交将嵌套数据发布到ActionResult参数中? 我一直在尝试实现一个类似于的解决方案,但运气不太好 所述表格的部分结构如下: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
<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对象。