ASP.NETMVC 3中复杂类型列表的最佳实践是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (70)

这是一个复杂的问题来描述。基本上,我有一个添加/编辑视图,允许用户编辑某些对象的字段。这个对象非常复杂:它有一些字段,它有一个复杂对象的子列表。每个复杂的对象大约有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" />元素(每个子项) - 它仍然会在回发时正确绑定到模型,我会感觉这个问题解决了。

提问于
用户回答回答于

仍然需要一个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;。

用户回答回答于

你有没有考虑使用像骨干或挖空的JavaScript框架?

扫码关注云+社区

领取腾讯云代金券