这可能会因情况而异,但作为一般规则,如果您使用来自 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。