【问题标题】:Concerns about Ajax use in ASP.NET MVC3关于在 ASP.NET MVC3 中使用 Ajax 的担忧
【发布时间】:2012-05-01 14:04:00
【问题描述】:

我最近才研究 Ajax(专家们笑我),我对所有添加的功能感到兴奋。但也有一些顾虑。

  1. 表单提交

    在 Ajax 示例中,一个 json 对象要么自动创建(序列化表单),要么通过从每个 DOM 项中检索 val() 手动构建。并且使用javascript执行数据验证。我认为我们可能仍然可以使用 Html.EditorFor(和 Html.TextboxFor 等)来构建表单。但是是否仍然可以使用模型/视图模型上添加的 DataAnnotation 属性?我见过的 MVC+Ajax 示例通常不执行任何类型的服务器端验证。可以省略那部分吗?我想这很好,因为用户现在必须启用 javascript 才能提交表单。但我们需要一些专业的建议。

  2. 查看模型

    在 Ajax 世界中,视图模型通常表示为 JSON 对象。 (如果我错了,请纠正我。)那么,在我们的域模型和视图模型之间映射的最佳方式是什么?有没有像 AutoMapper 这样的工具?

    好的,我需要在这里添加一些东西............

    引起这种担忧的原因是我发现一些示例使用名为 Knockout.js (See its website) 而不是 return Json(model) 将我们的视图模型的 json 对象返回到 $.Ajax 调用中,它的示例显示了一个视图模型是用 javascript 构建的。

    // 这是一个简单的 *viewmodel* - 定义 UI 数据和行为的 JavaScript 函数 AppViewModel() { this.firstName = "伯特"; this.lastName = "伯廷顿"; } // 激活 knockout.js ko.applyBindings(new AppViewModel());

    这种做法有什么好处?

    ----我的更新结束----

感谢您提供任何有用的建议。

【问题讨论】:

  • 忽略服务器端验证是绝对不行的。
  • blaise,正如我在思考网站回复中提到的那样,Automapper 会以两种方式完成您需要的一切(如果确实需要,即通常,您会在发送到视图之前将域模型映射到视图模型. 99% 的情况下,通过 httppost 返回的模型将是您的域模型)

标签: jquery ajax asp.net-mvc-3


【解决方案1】:

1) 不要忽略服务器端验证。 MVC 有一些内置功能可以在服务器端为您完成其中的一些功能,但最好测试它是否正常工作。通常这只是测试类型、长度、范围和其他一些基本验证。任何复杂的验证都应该由您完成。无论哪种方式都进行测试以确保确实发生了正确的验证。

2) Json 是最常见的,因为它与 JavaScript 一起使用并且易于在 .Net 中序列化。我推荐 Newtonsoft.Json 作为你的序列化库。但是,您可以使用任何可以解析的语言,从 protobuff 到 XML。

ViewModel 是一个模型,它被发送到视图,用于视图需要的并且通常只以一种方式发送到视图。

域模型是您持久化的对象,通常从客户端到服务器双向传输。

一个很好的例子可能是您的视图需要当前日期、经理数据和员工数据,因此您的视图模型包含所有这些属性,但表单只编辑员工,这是一个被发回的域模型从客户端到服务器进行持久化。

MVC 有 ModelBinders 可以获取您的帖子数据并将它们转换为您需要的任何类型(假设您正确遵循它的约定。)您不太可能必须将视图模型映射到域模型。

【讨论】:

  • 感谢您的回复。我的理解是 View Model 是一个数据传输对象。提交表单时,收集的值首先填充到视图模型(针对该视图)。但是领域模型可能有额外的属性,或者有时需要一些数据转换(比如将一个 string[] 数组变成一个字符串存储在数据库中)。在这种情况下,我们必须在视图模型和域模型之间映射这些属性。
  • blaise - 如果您需要复杂(或简单)的映射,AutoMapper 就是您的最佳选择。做你需要的一切,然后一些!
  • 如果您愿意,您可以使用视图模型从表单返回,这没有错或反对,是的,如果您愿意,您可以使用 automapper。我不记得有一次我将模型作为视图模型发回。通常自动检测到的路由参数已经足够了。这是做事的一种方式,但不是唯一的方式,也不是“正确”的方式,因为正确的方式是可行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2012-04-30
  • 2014-07-15
  • 2011-01-30
相关资源
最近更新 更多