【问题标题】:ASP.NET MVC - is it better to use custom JQuery validation as opposed to using Model annotations?ASP.NET MVC - 使用自定义 JQuery 验证比使用模型注释更好吗?
【发布时间】:2012-04-25 14:19:01
【问题描述】:

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

谢谢

【问题讨论】:

  • 我只能谈论我...我更喜欢模型注释。
  • 你不认为使用 JQuery 比在模型中使用 C# 代码更灵活吗?
  • 您需要客户端验证以及服务器端验证。
  • 谁投票关闭?你能评论一下你为什么要关闭它吗?这是一个有效的问题!
  • 我也认为这是一个有效的问题。

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


【解决方案1】:

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

模型验证在 MVC3 中取得了长足的进步,并且可能比您想象的更灵活。

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

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

您可以将各种验证规则放入其中,包括基于多个输入值组合的规则(例如,password 和 password_repeat 必须相等)

【讨论】:

    【解决方案2】:

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

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

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

    但是很难理解为什么要这样做,因为适配器所做的只是将服务器端规则(可能是自定义的,可能不是)链接到其客户端等效规则。

    【讨论】:

      【解决方案3】:

      我也更喜欢模型注释。您可能拥有的任何 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;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多