我有一个Person实体,它包含一组"Education“实体。我想要的是从表单中收集"N“个Education条目。此"N“由”添加更多教育信息“和”删除教育信息“按钮控制。
在开始时,有一个空表单,它将收集一个Education条目。("person“对象存储在session中,最初有一个空的教育实体,我用这个"person”对象调用View )
如果用户单击"Add More Education Information“按钮,则添加另一个表单(以获取另一个教育信息,即来自另一个大学或另一个学位)我将另一个教育对象添加到"person”中,并再次调用view(person)
这可以正常工作,但旧数据会丢失。更好的说法是,表单中的数据没有映射到教育实体,即使我调用TryUpdateModel(person)也会丢失。每次我点击“添加更多教育信息”按钮,所有以前输入的数据都会丢失,所有表单都会变为空。
问:有没有更好的方法来解决这类问题(动态改变表单的数量)?或者,我应该进行哪些更改以保留旧数据?
谢谢。
我希望我能解释我的问题。
发布于 2009-10-15 14:48:56
我认为您最好扩展单个表单,并让它返回一个实体数组。也就是说,让您的第一个表单使用如下ids:
<%= Html.Hidden("Schools.index", 0) %>
<%= Html.TextBox("Schools[0].Name") %>
...然后,添加具有新索引的新元素。
<input type="hidden" id="Schools_index" name="Schools.index" value="1" />
<input type="text" id="Schools[1]_Name" name="Schools[1].Name" />
...并将它们作为集合接收。
public ActionResult AddEducation( Person person, School[] schools )
{
}这将使您能够一次性提交所有信息,而不必担心部分提交以及如何处理不完整的提交。
请注意,您的javascript必须找到当前的最大索引,才能知道新元素的名称/ids。
$('#addSchooButton').click( function() {
var index = $('#form').find('[name=Schools.index]:last').attr('value') + 1;
$('<input type="text" id="Schools[' + index + ']_Name" name="Schools[' + index + '].Name" />').appendTo( '#form' );
...
});实际上,您可能会创建一个完整的容器--可能是克隆一个现有的容器,并根据下一个索引值将克隆中的In替换为适当的in。
有关更多信息,请参考Phil Haack在model binding to a list上的文章。
https://stackoverflow.com/questions/1572843
复制相似问题