我有一个复杂的表格
它允许用户创建一个包含许多活动的IncomeDeclaration。
当活动的标记是这样的时,这可以正常工作:
<tr>
<td>SomeActivity
<input type="hidden" value="13123" name="EconomicActivityIncomeDeclarations[0].EconomicActivityId" id="EconomicActivityIncomeDeclarations_0__EconomicActivityId">
</td>
<td>
<input type="text" name="EconomicActivityIncomeDeclarations[0].GrossIncome" id="EconomicActivityIncomeDeclarations_0__GrossIncome" />
</td>
</tr>
<tr>
<td>SomeActivity
<input type="hidden" value="654654" name="EconomicActivityIncomeDeclarations[1].EconomicActivityId" id="EconomicActivityIncomeDeclarations_1__EconomicActivityId">
</td>
<td>
<input type="text" name="EconomicActivityIncomeDeclarations[1].GrossIncome" id="EconomicActivityIncomeDeclarations_1__GrossIncome" />
</td>
</tr>
问题是我通过javascript动态添加更多活动..这就是渲染新创建的表单元素
<tr>
<td>SomeActivity
<input type="hidden" value="987987" name="EconomicActivityIncomeDeclarations[1b117bc9-ce4b-46d5-9de0-77ba98b82fd0].EconomicActivityId" id="EconomicActivityIncomeDeclarations_1b117bc9-ce4b-46d5-9de0-77ba98b82fd0__EconomicActivityId">
</td>
<td>
<input type="text" name="EconomicActivityIncomeDeclarations[1b117bc9-ce4b-46d5-9de0-77ba98b82fd0].GrossIncome" id="EconomicActivityIncomeDeclarations_1b117bc9-ce4b-46d5-9de0-77ba98b82fd0__GrossIncome" />
</td>
</tr>
我得到的奇怪行为是当前两个(或更多)具有常规格式[0],1 ...等等然后我(通过ajax)添加更多表单元素Post Action实际上只将ajax元素绑定到Model ...
所以基本上一个IncomeDeclaration,我在这里使用的所有3个活动作为例子,只会将第三个(随机字符)添加到IncomeDeclaration ....
我知道它有点复杂,但如果有人知道为什么会发生这种行为,我很感激......
顺便说一下,我正在使用的是什么。 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/答案 0 :(得分:0)
您需要保持序列正确。添加新活动后,使用jquery以正确的顺序重命名文本框。
这是我用过的代码。
var tbody = $('#tableId');
var trs = tbody.children();
var row = 0;
for (row = 0; row < trs.length; row++) {
var txts = trs[row].getElementsByTagName('input');
for (i = 0; i < txts.length; i++) {
var name = txts[i].getAttribute('name');
txts[i].setAttribute('name', name.replace(/\[.*\]/, 'People[' + row
+ ']'));
}
}
答案 1 :(得分:0)
你可能想看一下这篇文章:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx最后Haacked谈到了他们在不是序列时绑定项目的帮助。
那就是说,当我有一个复杂的清单时,我通常采取另一种方式。它只适用于启用javascript。在提交时,我构建了一个表示列表的json对象。然后我使用json2库对json进行字符串化并将其放在一个隐藏的字段中,该字段将被发布。在服务器端,使用JavaScriptSerializer和它的Deserialize方法很容易构建列表。
这是一项更多的工作。我猜它最终会有大约8行javascript和2行服务器端代码。
答案 2 :(得分:0)
您可以尝试使用本文中介绍的字典模型绑定器 - Dictionary Model Binder in ASP.NET MVC2 and MVC3
您应该在代码中唯一修复的是不同类型的关键元素。所有键应具有相同的类型。
请阅读我对有关DefaultDictionaryBinder类源的建议更改的文章的评论。