繁体   English   中英

ASP.NET MVC 3 中复杂类型列表的最佳实践

[英]Best Practice for Lists of Complex Types in ASP.NET MVC 3

这是我的第一个 SO 问题,与其说是“我该怎么做”,不如说是“最干净的方法是什么”,因为我看到了几种方法,但似乎没有一个对我很有吸引力.

这是一个有点复杂的问题来描述。 本质上,我有一个添加/编辑视图,允许用户编辑某些 object 的字段。 这个 object 非常复杂:它有一些字段,还有一个复杂对象的子列表。 每个复杂的 object 大约有 40 个字段(主要是复选框、单选按钮和日期/时间)。 我将其表示为 select 列表:


(来源: fortheloot.com

添加按钮会生成包含各种字段的对话框。

问题来了。 当用户接受对话框并且对话框关闭时,我现在必须将此数据存储在某处,以便用户可以在实际提交表单之前进一步编辑它或添加其他子项。

最明显的方法是为每个子对象创建一组隐藏字段。 因此,添加一个子项会在<form>元素中添加 40 多个隐藏元素。 添加 10 个子项,您就有 400 个隐藏字段。 这将正常工作,如果字段命名正确,将绑定到此 model:

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 */ }
}

在 model 绑定方面,这看起来不错,但从客户端来看,我必须跟踪数百个 DOM 元素,这对我来说似乎很麻烦。 从 40 个其他元素中加载和卸载对话框的各种表单元素似乎......可能会更好。

Ideally, I'd like to be able to just store the data as a javascript object on the <option> element using either data- HTML 5 attributes or jQuery's data() function, which are really one and the same. 这将使 javascript 方面更加干净,但它不会在回发时自动绑定到 model。

如果有一种方法可以两全其美——在<option>元素上存储单个 JS object,甚至是单个<input type="hidden" />元素(每个子项)——仍然在回发时正确绑定到 model,我觉得这个问题已经解决了。

您仍然需要一个 html 字段(类型=隐藏)才能将此数据发送回服务器。 (您可以使用 ajax 帖子,但这可能不是一个好主意)

I would suggest designing a reasonable object model to contain these data structures, and serializing the object model each time you make a change it to json with stringify

Then when you post back the form, the json will be sent to the server and you can deserialise the whole object model to a set of classes written in c# (which can mimic the object model you had in javascript) using the JavaScriptSerializer classes

编辑:

要反序列化 json 字符串,可以使用以下代码:

JavaScriptSerializer js = new JavaScriptSerializer(); 
var c = js.Deserialize<MyClass>(json);
return View(c);

如果您将 json 作为帖子消息正文回发(例如 $.ajax 或 $.post 方法),那么 MVC3 将自动进行绑定,您只需在帖子中指定正确的内容类型:application/json; 请点击下面我评论中的链接,了解有关其工作原理的更多详细信息。

马丁

您是否考虑过使用 javascript 框架,例如骨干网或淘汰赛? https://stackoverflow.com/questions/5112899/knockout-js-vs-backbone-js-vs

由于我们一直使用 javascript,因此我也会坚持使用 javascript 的回发行为。 当您在列表中输入新项目时,我将继续构建一个多维 javascript 数组,然后将该数组转换为 json,然后通过 ajax 帖子将其发送到您的 MVC 路由。

As long as the json object conforms to the naming standards of your model, MVC will already do the implicit model binding before it gets to the action method.

最简单、最优雅的方法是什么? 淘汰赛.js! 在淘汰赛中,您将创建一个可观察的集合并添加到您的集合中,而无需使用 javascript arrays 的肮脏语法。 然后,在发布 ajax 帖子之前,您将调用敲除 toJSON 方法将集合转换为 json。

我强烈推荐在 Knockout 上观看 PluralSight 视频,然后下载源代码。

我会写一个示例,但我必须回去工作:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM