我刚刚开始使用带有 Razor 的 ASP.NET 的 MVC 模式,一切都很棒!用于验证的模型注释起初看起来很棒,但现在它变得非常烦人,因为似乎没有一种直接的方式来验证复选框,并且将您自己的 JQuery 验证与模型一起集成到表单中似乎很痛苦验证。似乎通过在模型中添加注释 asp.net 正在为您完成工作,这很好,但是当涉及到自定义站点时,我不需要预先完成任何事情。那么,最好使用 JQuery 进行自己的验证,还是坚持使用模型中的注释?
谢谢
我刚刚开始使用带有 Razor 的 ASP.NET 的 MVC 模式,一切都很棒!用于验证的模型注释起初看起来很棒,但现在它变得非常烦人,因为似乎没有一种直接的方式来验证复选框,并且将您自己的 JQuery 验证与模型一起集成到表单中似乎很痛苦验证。似乎通过在模型中添加注释 asp.net 正在为您完成工作,这很好,但是当涉及到自定义站点时,我不需要预先完成任何事情。那么,最好使用 JQuery 进行自己的验证,还是坚持使用模型中的注释?
谢谢
从安全角度来看,仅客户端验证是一个大错误。绝对在服务器端验证;如果两者都做很痛苦,请放弃客户端验证。
模型验证在 MVC3 中已经取得了相当大的进展,并且可能比你想象的更灵活。
例如,您可以在模型上实现 IValidatableObject,这需要定义此方法:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
您可以将各种验证规则放入其中,包括基于多个输入值组合的规则(例如 password 和 password_repeat 必须相等)
最重要的是您有服务器端验证。您不必使用数据注释:您可以尝试使用另一种验证方法,例如实现 IValidatableObject,或集成另一个验证框架。
根据我的经验,数据注释(连同不显眼的验证库)提供了一种简单且可扩展的方式来将服务器端规则链接到客户端实现,而不是在不同的地方定义相同的规则。
如果您想显式控制客户端验证(但仍然喜欢数据注释在服务器上的操作方式),那么您可以禁用 javascript 适配器(这会根据输入字段上呈现的数据属性添加客户端验证规则),并且手动实施客户端规则。
但是很难理解为什么要这样做,因为适配器所做的只是将服务器端规则(可能是自定义的,可能不是)链接到其客户端等效规则。
我也更喜欢模型注释。您可能拥有的任何 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;
}
}