我在哪里放置我的viewmodel验证?

时间:2012-09-26 09:43:15

标签: asp.net-mvc validation architecture

我们正在构建一个ASP.Net MVC应用程序,我们问了十二个问题,我们应该把输入数据的验证逻辑放在哪里。

我们已经进行了简单的验证:这些是viewmodel上的属性,如[required], [numeric] , [email]等等(这也是讨论的开头,顺便说一下)

但是现在我们还有一些输入验证:我们想验证从下拉列表中收到的ID是否是真正的ID。

例如:当我们收到91作为countryid时,我必须确保91是一个有效的countryid,而不是一个被'黑客入侵'用户的表格。因为如果它不是有效的countryid,我的数据层会生成错误。

  1. 我应该将它放在控制器动作方法中,因为那样 当请求中的数据到达时,方法知道什么是对的,什么是错的?

  2. 我应该把它放在VacancyValidator中(对象是空缺 对象)我把所有空缺相关的所有验证逻辑放在哪里 的ViewModels

  3. 我应该将它放在ViewModel中,因为它应该知道如何验证自己

  4. 我应该创建一个验证我在ViewModels属性上放置的属性的属性

  5. 我应该将它放在空缺[thisviewmodelsname]验证器中,我为此特定视图模型放置所有验证逻辑

  6. 任何想法都赞赏....

3 个答案:

答案 0 :(得分:2)

  

我们已经有了简单的验证:这些是属性   在viewmodel上,如[required],[numeric],[email]等(这是   开放供讨论,顺便说一句

我建议使用FluentValidation.NET代替使用ASP.NET MVC plays nicely的数据注释。它提供了一种很好的语法,用于在相互依赖的属性之间表达复杂的验证逻辑,而无需编写数百万行管道基础结构代码(如果您使用数据注释并编写自定义验证器,则必须执行此操作),并且还允许您{{3非常容易。

  

因为如果它不是有效的countryid,我的数据层会生成错误。

你去了 - 你的数据层已经为你处理了这个验证。但是,如果您不想让它到达数据层,那么您可以在视图模型上为此属性设置验证规则。如果您按照我之前关于FluentValidation.NET的建议,您将知道将此规则放在何处 - 在您的视图模型的相应验证器中。

答案 1 :(得分:1)

您将验证显然放到视图模型中。这样它就位于一个位置(不是分散的,因此是DRY)并且在客户端和服务器上都可以运行。

希望这有帮助。

答案 2 :(得分:0)

最好的方法是结合客户端和服务器验证。对于客户端验证,您可以使用jquery validation plugin。它提供了所有标准验证模式(如maxlength,minlength,required等)。您可以在模型属性(数据注释)中指定验证要求,也可以直接在html中指定验证要求。此外,它还可以在从服务器代码返回验证结果时进行自定义remote验证。

但是您应该在服务器端公布客户端验证。例如,使用spring.net validation。我认为这是最好的通用和灵活的框架。