我们有一些视图模型,其中视图模型中包含的验证正在控制器中复制。除此之外,我们还有一些逻辑,我不确定它是否适合视图模型或控制器。
提前致谢。
答案 0 :(得分:1)
答案 1 :(得分:1)
如果您使用的是标准ASP.NET MVC模型验证提供程序:
另请参阅FluentValidation作为一个不错的替代实现。
答案 2 :(得分:0)
请查看System.ComponentModel.DataAnnotations
以获得可能对您有所帮助的验证。
对数据库的调用不应该在UI级别。保持数据库使用与表示逻辑分开。不要在视图模型中执行此操作,也不要在控制器中执行此操作(如果可以避免)。让控制器在域服务层(业务逻辑层)上调用引用数据层的东西是最好的。
答案 3 :(得分:0)
这可能会因个案而异,但作为一般规则,如果您使用ASP.NET MVC中的默认项目/脚本(包括jQuery.Validate.Unobtrusive),请按照以下步骤进行操作:
viewModel是否验证客户端和服务器级别,如果这是自动的,或者我们是否需要实现某些功能。
是和否。取决于您的case
/ project
/ referenced scripts
/ rules used
。 应该是项目中的jquery.validate.unobtrusive.js
项目以及jquery.validate.js
,当然还有jquery.js
用于自动进行客户端验证(不引人注目) )。
但客户端验证规则有限,他们不会验证所有内容。另一方面,您可以非常轻松地扩展它。如果客户端不支持验证规则,并且您未实施该规则,则仅在服务器端验证它。
不显眼的验证可以帮助您进行自动客户端验证,而不是手动检查每个字段的有效输入/选择。它并不完美,但在大多数情况下应该可以正常工作。
如果您需要进行数据库调用以检查可用性的字段,则此验证应位于视图模型或控制器的httppost中。
没有"普遍规则"为此,有些人会认为db相关方法必须在存储库上,有些人会在控制器上允许它,因为这与验证有关,有些人会在验证规则中对其进行验证。
我将这种规则放入控制器或存储库中,看起来像更精细的存储库。
在我们的项目中,当我们有一些额外的与有效性相关的检查需要任何db调用时,它们会在控制器上调用一个方法,该方法将调用委托给存储库。这允许我们在需要时从客户端和服务器端调用相同的方法(例如:在键入后检查是否已经使用了用户名)。
就个人而言,我不喜欢DataAnnotations。我曾经,但现在不再这样了,因为它很难继续进行复杂多重验证的大型项目。
我建议你选择具有良好流畅界面且可扩展的FluentValidation。它也允许客户端和服务器端验证,并允许您以友好的方式执行复杂的任务。
例如,我们已经创建了一个自定义规则(使用它的客户端部分)来检查已注册的电子邮件,该电子邮件调用控制器并接收json结果以解析并验证该字段。通过这种方式,我们只需RuleFor(_account => _account.Email).NotAlreadyTaken()
即可在客户端和服务器端验证电子邮件,并通过ModelState.IsValid
获取,就像使用DataAnnotations一样。
但在您询问DataAnnotations是否无法做到这一点之前(或其他人来这里说它可能),是的,没有FluentValidation 就可以。我认为这更像是个人选择。
FluentValidation的有趣之处在于,您可以使用单独的程序集 进行验证,并使用Ninject或任何其他IoC提供所有验证。
无论如何,请检查this tutorial如何开始使用DataAnnotations进行客户端验证,或FluentValidation website开始使用FluentValidation。