【问题标题】:Where should ASP.NET MVC 2 validation go: in the model or viewmodel classes?ASP.NET MVC 2 验证应该去哪里:在模型或视图模型类中?
【发布时间】:2011-05-03 12:05:15
【问题描述】:

我正在使用 automapper 将我的模型映射到 viewmodel 类以传递给我的视图。

我的问题真的是验证应该去哪里?我正计划使用元数据装饰——mvc 2 的一个特性。

但是在模型还是视图模型中?还是在这两个地方?

【问题讨论】:

    标签: asp.net-mvc-2 model viewmodel


    【解决方案1】:

    验证应在视图模型中进行,因为这是您作为操作参数接收的内容并包含用户输入。您还可以在模型上进行验证。

    【讨论】:

      【解决方案2】:

      我的答案是 ViewModel,因为 Model 可以改变(例如从使用 Linq2SQL 到 EF)。这样,当您插入另一个模型时,您的验证仍然完好无损。

      【讨论】:

        【解决方案3】:

        我个人使用 DataAnnotations 验证了 2 个位置。我的模型没有完全传递给我的观点。我的视图有单独的模型,并将数据从视图模型转换为模型。这样,我可以在我的视图模型中放置我想要的任何东西,而忽略我不想处理的部分。

        然而,我的理由是我有一个 Windows 应用程序和一个使用相同模型的 Web 应用程序。这样,相同的一组验证规则管理所有应用程序的模型,如果需要,我的视图模型可以有稍微不同的规则。当然,这会产生“逻辑重复”——嗯,验证逻辑。

        这样,我不必每次返回服务器时都重新构建页面上未使用的数据,或者将其放入隐藏字段并扩大我的页面大小。

        【讨论】:

          【解决方案4】:

          模型应该实现它需要的验证,以确保它的状态不会变得无效;该验证绝对属于模型。 例如,图书类必须保证其标题必须在 1 到 50 个字符之间,其 id 必须 >= 0 等等。

          业务规则属于其他地方(如果您只有模型视图和控制器层,则在您的控制器中)。这可能类似于如果用户的电子邮件未经过验证,则用户不能添加超过 3 本书。

          视图中的验证应仅限于解析用户输入的无效数据:反 xss、sql 注入、超出范围。等等

          【讨论】:

            【解决方案5】:

            您应该将特定于 UI 的验证放在 ViewModel 中,并将与业务流程或数据库验证相关的任何内容放在 Model 中。这些可能重叠。

            【讨论】:

            • 感谢您的评论,所以我将为模型和视图模型使用数据注释? (属性)
            猜你喜欢
            • 2018-02-01
            • 2010-11-18
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            • 2010-11-18
            • 1970-01-01
            • 1970-01-01
            • 2010-09-13
            相关资源
            最近更新 更多