如何在 MVC3 中将不显眼的 JS 验证与自定义验证属性一起使用?

How to use unobtrusive JS validation with custom validation attributes in MVC3?

提问人:mare 提问时间:3/3/2011 更新时间:3/3/2011 访问量:1793

问:

我调用了这个自定义验证属性,该属性派生自该属性,它的功能仅在文本框字段缺少值时显示星号 (*)。AsteriskRequiredAttributeRequired

MVC3 不显眼的 JS 验证似乎与属性完美配合,但与我的自定义属性不符 - 什么也没发生。Required

怎么回事?

asp.net-mvc-3 jquery-validate unobtrusive-javascript

评论


答:

3赞 kenwarner 3/3/2011 #1

http://samipoimala.com/it/2010/11/29/unobtrusive-client-validation-in-asp-net-mvc-3/

事实证明,实现自定义属性确实是一件容易的事。实现自己的类,该类继承 System.ComponentModel.DataAnnotations.ValidationAttribute 并实现 System.Web.Mvc.IClientValidatable。所以你需要做三件事。

1) 覆盖 public bool IsValid(object value) 此方法将在服务器上完成验证时运行(例如,如果客户端未启用 javascript)。如果您不需要客户端验证,这就是您需要做的全部事情。

2) 创建一个继承自 ModelClientValidationRule 的类。这通常非常简单。下面是如何在客户端上启用电子邮件验证的示例:

public class ModelClientValidationEmailRule : ModelClientValidationRule
{
    public ModelClientValidationEmailRule(string errorMessage)
    {
        base.ErrorMessage = errorMessage;
        base.ValidationType = "email";
    }
}

3) 实现公共 IEnumerable GetClientValidationRules(ModelMetadata 元数据,ControllerContext context)

这通常也很容易实现,以下是电子邮件验证的示例:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    yield return new ModelClientValidationEmailRule(FormatErrorMessage(metadata.GetDisplayName()));
}

这就是您编写自己的属性以使用 jQuery Validate 插件上的现成验证规则启用验证所需要做的全部工作。