这是一个复杂的问题来描述。基本上,我有一个添加/编辑视图,允许用户编辑某些对象的字段。这个对象非常复杂:它有一些字段,它有一个复杂对象的子列表。每个复杂的对象大约有40个字段(主要是复选框,单选按钮和日期/时间)。我已将此列为选择列表:
http://fortheloot.com/public/pictures/sub-items.png
在添加按钮滋生与各领域的对话。
问题在这里。当用户接受对话框并关闭对话框时,我现在必须将这些数据存储在某处,以便用户可以在实际提交表单之前进一步编辑或添加其他子项。
最明显的做法是为每个子对象创建一组隐藏字段。所以,添加一个子项目会为元素添加40个隐藏元素<form>
。添加10个子项目,并且有400个隐藏字段。这样可以正常工作,并且如果字段命名正确,它将绑定到此模型:
public class AddEditModel
{
[Display(Name = "ID")]
public int? Id { get; set; }
[Display(Name = "Name")]
[Required]
[StringLength(100)]
public string Name { get; set; }
public IList<EntryModel> Entries { get; set; }
public class EntryModel { /* fields */ }
}
在模型绑定方面,这看起来很不错,但从客户端来说,我不得不跟踪数百个DOM元素,这对我来说似乎很麻烦。从40个其他元素加载和卸载对话框的各种表单元素似乎......可能会更好。
理想情况下,我希望能够<option>
使用data-
HTML 5属性或jQuery的data()
函数将数据作为JavaScript对象存储在元素上,这些功能实际上是一样的。这将使事情的JavaScript方面更简洁,但它不会在回发时自动绑定到模型。
如果有两种方法来实现两全其美的方式 - 在<option>
元素上存储单个JS对象,或者甚至是单个<input type="hidden" />
元素(每个子项) - 它仍然会在回发时正确绑定到模型,我会感觉这个问题解决了。
发布于 2018-03-12 12:03:05
仍然需要一个html字段(type = hidden)才能将此数据发送回服务器。(你可以使用ajax文章,但这可能不是一个好主意)
我会建议设计一个合理的对象模型来包含这些数据结构,并且在每次将其更改为json和stringify时序列化对象模型
然后,当发回表单时,json将被发送到服务器,并且您可以使用JavaScriptSerializer类将整个对象模型反序列化为一组使用c#编写的类(它可以模仿在javascript中使用的对象模型)
要反序列化json字符串,可以使用以下代码:
JavaScriptSerializer js = new JavaScriptSerializer();
var c = js.Deserialize<MyClass>(json);
return View(c);
如果你发回json作为邮件正文(例如$ .ajax或$ .post方法),那么绑定将自动发生在MVC3上,你只需要在邮件中指定正确的内容类型:application / json;。
发布于 2018-03-12 12:26:03
你有没有考虑使用像骨干或挖空的JavaScript框架?
https://stackoverflow.com/questions/-100007584
复制相似问题