【发布时间】:2011-05-05 05:53:25
【问题描述】:
这是我的第一个 SO 问题,与其说是“我该怎么做”,不如说是“最干净的方法是什么”,因为我看到了几种方法,但似乎都不是吸引我。
这是一个有点复杂的问题来描述。本质上,我有一个添加/编辑视图,允许用户编辑某些对象的字段。这个对象非常复杂:它有一些字段,并且有一个复杂对象的子列表。每个复杂对象大约有 40 个字段(主要是复选框、单选按钮和日期/时间)。我已将其表示为选择列表:
(来源:fortheloot.com)
添加按钮会生成包含各种字段的对话框。
问题来了。当用户接受对话框并且对话框关闭时,我现在必须将这些数据存储在某个地方,以便用户可以在实际提交表单之前进一步编辑它或添加其他子项。
最明显的方法是为每个子对象创建一组隐藏字段。因此,添加子项会将 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 个其他元素中加载和卸载对话框的各种表单元素似乎......可能会更好。
理想情况下,我希望能够使用data- HTML 5 属性或jQuery 的data() 函数将数据作为javascript 对象存储在<option> 元素上,它们实际上是一回事。这将使事物的 javascript 方面更加简洁,但它不会在回发时自动绑定到模型。
如果有一种方法可以两全其美——在 <option> 元素上存储单个 JS 对象,甚至是单个 <input type="hidden" /> 元素(每个子项)——那仍然会绑定到模型在回发时正确,我觉得这个问题已经解决了。
【问题讨论】:
-
丹宁。好问题,艰难的场景。 +1 :)
标签: c# asp.net-mvc-3