3

我们正在构建一个 ASP.Net MVC 应用程序,我们问自己一个问题,我们应该将传入数据的验证逻辑放在哪里。

我们已经进行了简单的验证:这些是视图模型上的属性,例如[required], [numeric] , [email]等。(顺便说一句,这也可以讨论)

但是现在我们有更多的输入验证:我们想要验证从下拉列表接收到的 id 是否是真实的 id。

例如:当我们收到 91 作为 countryid 时,我必须确保 91 是有效的 countryid 而不是用户“侵入”表单的值。因为如果它不是有效的 countryid,我的数据层会生成错误。

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

  2. 我应该把它放在一个 VacancyValidator (对象是一个 Vacancy 对象)中,我将所有与空缺相关的视图模型的所有验证逻辑放在其中

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

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

  5. 我应该把它放在一个 Vacancy[thisviewmodelsname]Validator 中,我把这个特定视图模型的所有验证逻辑放在里面

任何想法表示赞赏....

4

3 回答 3

2

我们已经进行了简单的验证:这些是视图模型上的属性,例如 [required]、[numeric]、[email] 等(这也可以讨论,顺便说一句)

我会推荐FluentValidation.NET而不是与 ASP.NET MVC 配合得很好的Data Annotations 。它提供了一种很好的语法来表达相互依赖的属性之间的复杂验证逻辑,而无需编写数百万行管道基础设施代码(如果您使用数据注释并编写自定义验证器,您必须这样做),并且还允许您对您的验证逻辑很容易。

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

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

于 2012-09-26T09:55:59.550 回答
1

显然将验证放在了视图模型中。通过这种方式,它位于一个位置(不分散,因此 DRY)并且在客户端和服务器上都可以运行。

希望这可以帮助。

于 2012-09-26T13:41:33.440 回答
0

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

但是您应该将客户端验证与服务器端重复。例如,使用spring.net 验证。我认为它是最好的通用和灵活的框架。

于 2012-09-26T10:01:49.323 回答