ASP.NET MVC - 与使用模型注释相比,使用自定义JQuery验证更好吗?

时间:2012-04-25 14:19:01

标签: asp.net-mvc asp.net-mvc-3 razor

我刚开始使用带有Razor的ASP.NET的MVC模式,一切都很棒!验证的模型注释最初看起来很棒,但现在它变得非常烦人,因为似乎没有一种直接的验证复选框的方法,将您自己的JQuery验证与模型一起集成到表单中似乎很痛苦验证。似乎通过在模型中添加注释,asp.net正在为您完成工作,这很棒,但是当它归结为自定义网站时,我不需要任何预先做好的事情。 那么,最好使用JQuery进行自己的验证,还是坚持使用模型中的注释?

由于

3 个答案:

答案 0 :(得分:8)

从安全角度来看,仅客户端验证是大错误。绝对在服务器端验证;如果两者都很痛苦,请删除客户端验证。

模型验证与MVC3有很多相似之处,并且可能比你给它的功能更加灵活。

例如,您可以在模型上实现IValidatableObject,这需要定义此方法:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

您可以将各种验证规则放入您的心脏内容,包括基于多个输入值组合的规则(例如密码和密码重复值必须相等)

答案 1 :(得分:2)

最重要的是您有服务器端验证。您不必使用数据注释:您可以尝试使用其他方法进行验证,例如实现IValidatableObject或集成另一个验证框架。

根据我的经验,数据注释(与不显眼的验证库一起)提供了一种简单易用的方法,可以将服务器端规则链接到客户端实现,而不是在不同的地方定义相同的规则。

如果要显式控制客户端验证(但仍然喜欢数据注释在服务器上的运行方式),则可以禁用javascript适配器(这会根据输入字段上呈现的数据属性添加客户端验证规则) ),并手动实现客户端规则。

但很难理解你为什么要这样做,当所有适配器正在做的是将服务器端规则(可能是自定义的,可能不是)链接到它的客户端等价物。

答案 2 :(得分:1)

我也喜欢模型注释。您可能拥有的任何jQuery验证都希望将其作为模型注释,以确保通过禁用javascript或黑客来确保某人没有获得任何jQuery验证...

我发现添加复选框验证以及任何其他自定义验证的最简单方法是使用此处所述的CustomValidationAttribute:

http://weblogs.asp.net/peterblum/archive/2009/12/07/the-customvalidationattribute.aspx

示例:

[CustomValidation(typeof(Category), "FinalCheck")]
public partial class Category
{
   [CustomValidation(typeof(Category), "TestCategoryName")]
   public string CategoryName { get; set; }

   public bool Active { get; set; }

   public bool ShowOnHomepage { get; set; }

   public static ValidationResult FinalCheck(Category pCategory, ValidationContext pValidationContext)
   {
      if (!pCategory.Active && pCategory.ShowOnHomepage)
         return new ValidationResult("The category must be active in order to show it on the homepage.", new List<string> { "Active", "ShowOnHomepage" });
      return ValidationResult.Success;
   }

   public static ValidationResult TestCategoryName(string pNewName, ValidationContext pValidationContext)
   {
      if (Regex.IsMatch(pNewName, @"^\d"))
         return new ValidationResult("Cannot start with a digit", new List<string> { "CategoryName" });
      return ValidationResult.Success;
   }
}