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

时间:2011-03-03 00:03:16

标签: asp.net-mvc asp.net-mvc-3 jquery-validate unobtrusive-javascript

我有一个名为AsteriskRequiredAttribute的自定义验证属性,该属性派生自Required属性,它的功能只是在textbox字段缺少值时显示星号(*)。

MVC3不引人注目的JS验证似乎完全脱离了Required属性而不是我的自定义属性 - 没有任何反应。

怎么回事?

1 个答案:

答案 0 :(得分:3)

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(对象值) 在服务器上完成验证时将运行此方法(例如,如果客户端未启用javascript)。如果您不需要客户端验证,则需要执行此操作。

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

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

3)实现公共IEnumerable GetClientValidationRules(ModelMetadata元数据,ControllerContext上下文)

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

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

您只需编写自己的属性即可使用jQuery Validate插件上的现成验证规则进行验证。