定制验证提供商

时间:2016-12-16 15:27:00

标签: asp.net-mvc validation provider

在自己的验证提供程序的字段附近显示错误时遇到问题。提供程序在摘要验证块中工作并显示错误,但不在字段附近显示错误。

提供商已添加到 Global.asax

中的提供商列表中
ModelValidatorProviders.Providers.Add(new FFvalidator());

FFvalidator 代表该代码:

public class FFvalidator : ModelValidatorProvider
{
    public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
    {
        if(metadata.ContainerType == typeof(RegisterViewModel))
        {
            return new ModelValidator[] { new UserRegPropertyValidator(metadata, context) };
        }
        if(metadata.ModelType == typeof(RegisterViewModel))
        {
            return new ModelValidator[] { new UserRegValidator(metadata, context) };
        }

        return Enumerable.Empty<ModelValidator>();
    }
}

Validator继承自 ModelValidator 看起来像这样:

public class UserRegPropertyValidator : ModelValidator
{
...
}

验证方法( UserRegPropertyValidator 的方法)如下所示:

        public override IEnumerable<ModelValidationResult> Validate(object container)
        {
        RegisterViewModel u = container as RegisterViewModel;
        if(u != null)
        {
            switch (Metadata.PropertyName)
            {
                case "UserName":
                    Regex rgx = new Regex(@"^[0-9a-zA-Z-,]{1,35}$");
                    if ( !rgx.IsMatch(u.UserName) )
                    {
                        return new ModelValidationResult[]
                        {
                            new ModelValidationResult {MemberName="UserName", Message="Кроме букв, допустимы только символы - и ,"}
                        };
                    }
                    break;
            }

        }

但问题是,AJAX验证不起作用。 ASP验证效果很好,例如电子邮件绑定器会在需要时显示字段附近的错误。

查看:

<div class="form-group">
@Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
</div>
</div>

0 个答案:

没有答案