IClientValidatable实现是否违反了MVC中的DRY原则?

时间:2014-03-27 21:50:09

标签: c# javascript jquery asp.net-mvc validation

MVC提供了许多验证属性,可用作数据注释来执行简单的服务器端验证。

但是,如果我想使用自己的业务逻辑进行一些自定义验证,我需要创建一个派生自ValidationAttribute的自定义验证属性,并覆盖IsValid方法。

到目前为止一切顺利。

但是,如果我想在客户端执行相同的验证,我需要在验证属性类中实现IClientValidatable接口,并实现GetClientValidationRules方法,这将告诉我的应用程序此验证也必须在客户端执行。

然而,有争议的问题是我需要使用jQuery将此客户端验证的逻辑编写为单独的JavaScript。这与我在覆盖IsValid方法时在C#(或VB)中编写的逻辑完全相同。

为什么我必须写两次相同的逻辑,虽然用不同的语言?这不违反DRY原则吗?我本以期望MVC为验证逻辑本身生成JavaScript。

说明我所说的内容的示例:http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/enabling-client-side-validation-on-custom-data-annotations-w/

修改

另外,如果我的验证逻辑需要来自应用程序配置文件或应用程序缓存的数据,该怎么办?我如何在我为客户端验证编写的jQuery方法中使用它?如果我不能,是否还有其他方法可以进行客户端验证,其逻辑使用应用程序数据?

1 个答案:

答案 0 :(得分:2)

是的,但它经常值得。

客户端验证的好处是速度和服务器负载更少。服务器验证的好处是安全性。实现两者都是两全其美的。

DRY是一个很好的经验法则,但与所有经验法则一样,在某些情况下应该违反规则。

编辑以回答您的跟进问题

如果您的jQuery需要来自服务器端配置的值,您需要将其作为JavaScript的一部分传递给客户端。例如,您可以在视图中定义一个保存服务器端值的变量。