【发布时间】:2011-05-03 12:05:15
【问题描述】:
我正在使用 automapper 将我的模型映射到 viewmodel 类以传递给我的视图。
我的问题真的是验证应该去哪里?我正计划使用元数据装饰——mvc 2 的一个特性。
但是在模型还是视图模型中?还是在这两个地方?
【问题讨论】:
标签: asp.net-mvc-2 model viewmodel
我正在使用 automapper 将我的模型映射到 viewmodel 类以传递给我的视图。
我的问题真的是验证应该去哪里?我正计划使用元数据装饰——mvc 2 的一个特性。
但是在模型还是视图模型中?还是在这两个地方?
【问题讨论】:
标签: asp.net-mvc-2 model viewmodel
验证应在视图模型中进行,因为这是您作为操作参数接收的内容并包含用户输入。您还可以在模型上进行验证。
【讨论】:
我的答案是 ViewModel,因为 Model 可以改变(例如从使用 Linq2SQL 到 EF)。这样,当您插入另一个模型时,您的验证仍然完好无损。
【讨论】:
我个人使用 DataAnnotations 验证了 2 个位置。我的模型没有完全传递给我的观点。我的视图有单独的模型,并将数据从视图模型转换为模型。这样,我可以在我的视图模型中放置我想要的任何东西,而忽略我不想处理的部分。
然而,我的理由是我有一个 Windows 应用程序和一个使用相同模型的 Web 应用程序。这样,相同的一组验证规则管理所有应用程序的模型,如果需要,我的视图模型可以有稍微不同的规则。当然,这会产生“逻辑重复”——嗯,验证逻辑。
这样,我不必每次返回服务器时都重新构建页面上未使用的数据,或者将其放入隐藏字段并扩大我的页面大小。
【讨论】:
模型应该实现它需要的验证,以确保它的状态不会变得无效;该验证绝对属于模型。 例如,图书类必须保证其标题必须在 1 到 50 个字符之间,其 id 必须 >= 0 等等。
业务规则属于其他地方(如果您只有模型视图和控制器层,则在您的控制器中)。这可能类似于如果用户的电子邮件未经过验证,则用户不能添加超过 3 本书。
视图中的验证应仅限于解析用户输入的无效数据:反 xss、sql 注入、超出范围。等等
【讨论】:
您应该将特定于 UI 的验证放在 ViewModel 中,并将与业务流程或数据库验证相关的任何内容放在 Model 中。这些可能重叠。
【讨论】: