MVC提供了大量的验证属性,这些属性可以用作数据注释来执行简单的服务器端验证。
然而,如果我想使用我自己的业务逻辑做一些自定义验证,我需要创建一个自定义验证属性,从ValidationAttribute
派生,并覆盖IsValid
方法。
一切顺利。
然而,如果我想在客户端执行相同的验证,我需要在我的验证属性类中实现IClientValidatable
接口,并实现GetClientValidationRules
方法,这将告诉我的应用程序该验证也必须在客户端执行。
IsValid
方法时编写的逻辑完全相同。
为什么我必须用不同的语言写两次相同的逻辑?这难道不违反DRY原则吗?我本来希望MVC为验证逻辑本身生成JavaScript。
举例说明我在说什么:http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/enabling-client-side-validation-on-custom-data-annotations-w/
编辑:另外,如果我的验证逻辑需要来自应用程序配置文件或应用程序缓存的数据该怎么办?我如何在为客户端验证编写的jQuery方法中使用它?如果不能,是否有其他方法来进行客户端验证,其逻辑使用应用程序数据?
是的,但这通常是值得的。
客户端验证的好处是速度和更少的服务器负载。服务器验证的好处是安全性。两者同时实现,可以获得两全其美的效果。
DRY是一个很好的经验法则,但是和所有的经验法则一样,在某些情况下应该违反该法则。
编辑回答您的后续问题
如果你的jQuery需要服务器端配置的值,你需要将其作为JavaScript的一部分传递给客户端。例如,您可以在视图中定义一个变量来保存服务器端值。