Asp.net mvc 2 ASP.NET MVC 2验证应该去哪里:在model或viewmodel类中?

Asp.net mvc 2 ASP.NET MVC 2验证应该去哪里:在model或viewmodel类中?,asp.net-mvc-2,model,viewmodel,Asp.net Mvc 2,Model,Viewmodel,我正在使用automapper将我的模型映射到viewmodel类以传递到我的视图 我的问题是验证应该去哪里?我计划使用元数据装饰——MVC2的一个特性 但在模型或视图模型中?或者在这两个位置?验证至少应该在视图模型上进行,因为这是作为操作参数接收的,并且包含用户输入。您还可以在模型上进行验证。我的答案是ViewModel,因为模型可以更改(例如,从使用Linq2SQL到EF)。这样,当您插入另一个模型时,您的验证仍然完好无损。我个人使用DataAnnotation在两个位置进行验证。我的模型没

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

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


但在模型或视图模型中?或者在这两个位置?

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

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

我个人使用DataAnnotation在两个位置进行验证。我的模型没有完全传递给我的视图。我的视图有单独的模型,并将数据从视图模型转换到模型中。这样,我就可以在我的视图模型中放入我想要的任何内容,并省略我不想处理的部分

然而,我的理由是,我有一个windows应用程序和一个使用相同模型的web应用程序。这样,同一组验证规则控制所有应用程序的模型,如果需要,我的视图模型可以有稍微不同的规则。当然,这创造了一个“逻辑的复制”——好的,验证逻辑


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

模型应实现所需的验证,以确保其状态不会变为无效;这种验证肯定属于模型。 例如,book类必须保证其标题必须介于1到50个字符之间,其id必须大于等于0,等等

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


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

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

谢谢您的评论,所以我将对model和viewmodel使用数据注释?(属性)