在MVC应用程序中永远不会调用GetClientValidationRules

时间:2014-06-23 23:07:05

标签: asp.net asp.net-mvc validationattribute

我有一个实现IClientValidatable的自定义ValidationAttribute。但是从不调用GetClientValidationRules来实际将验证规则输出到客户端。

属性没有什么特别之处,但由于某种原因它从未被调用过。我已经尝试在Application_Start()中注册适配器,但这也不起作用。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class CustomAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        return true;
    }
    #region IClientValidatable Members

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        string errorMessage = FormatErrorMessage(metadata.GetDisplayName());

        yield return new ModelClientValidationRule { ErrorMessage = errorMessage, ValidationType = "custom" };
    }

    #endregion
}

public class CustomAdapter : DataAnnotationsModelValidator<CustomAttribute>
{
    public CustomAdapter(ModelMetadata metadata, ControllerContext context, CustomAttribute attribute)
        : base(metadata, context, attribute)
    {
    }
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return this.Attribute.GetClientValidationRules(this.Metadata, this.ControllerContext);
    }
}

在Application_Start()中我有:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomAttribute), typeof(CustomAdapter));

当我在GetClientValidationRules中放置一个断点时,它永远不会被击中。

1 个答案:

答案 0 :(得分:0)

要调用GetClientValidationRules()方法,您必须启用客户端验证支持。它可以通过以下方式完成:

在web.config中(适用于所有应用程序页面):

<appSettings>
    <add key="ClientValidationEnabled" value="true" />

或仅针对特定观点:

或者

@{ Html.EnableClientValidation(); }

@(ViewContext.ClientValidationEnabled = true)

请注意必须先行

@using (Html.BeginForm())

语句。

如果您使用 jquery不显眼的验证(目前似乎是标准),您还需要启用它:

<add key="UnobtrusiveJavaScriptEnabled" value="true" />
web.config

中的

@Html.EnableUnobtrusiveJavaScript()

特定观点。