在自己的验证提供程序的字段附近显示错误时遇到问题。提供程序在摘要验证块中工作并显示错误,但不在字段附近显示错误。
提供商已添加到 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>