自定义验证程序不会更改已验证的输入类

时间:2012-05-18 12:51:05

标签: asp.net-mvc-3 validation

对于多个必填字段的简单验证,我使用了here

解释的自定义验证器

我正在获得所需的行为并且验证摘要消息正确显示,但我现在缺少的是无效输入元素上缺少验证错误css类, 在使用内置验证器时添加。

这是正确的行为:

<input class="input-validation-error" name="ModelName" ... />

这就是我在使用提到的自定义验证器时得到的结果:

<input name="ModelName" ... />

请注意,我指的是服务器端验证。

更新

这是我的模特:

public class Register
{
        [MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

这是渲染的输出:

<input class="text-box single-line" data-val="true" data-val-multifield="Please provide all required information" id="Name" name="Name" type="text" value="" />
<input class="text-box single-line" data-val="true" data-val-multifield="Please provide all required information" id="UserName" name="UserName" type="text" value="" />

我现在意识到只有当我使用 MultiFieldRequired 属性装饰我的整个模型类时才出现问题:

[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
public class Register
{
...

在这种情况下,没有无效字段修改了css类,而在另一种情况下,当我对模型中的每个字段进行注释时,我得到相同的错误消息乘以无效字段的数量。

  

因此,总结一下 - 我想要一个错误消息,无论如何   无效字段的数量,我也希望每个无效字段   标有.input-validation-error class。

2 个答案:

答案 0 :(得分:2)

我刚试过这个,它运作正常。这是我做的:

<强>控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(IndexModel model)
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("NextAction");
        }
        return View(model);
    }
}

<强>型号:

public class IndexModel
{
    [MultiFieldRequiredAttribute(new string[] { "AreaCode", "PhoneNumber" })]
    public string AreaCode { get; set; }

    [MultiFieldRequiredAttribute(new string[] { "AreaCode", "PhoneNumber" })]
    public string PhoneNumber { get; set; }
}

我完全按照示例中提供的那样使用了验证:

public class MultiFieldRequiredAttribute : ValidationAttribute, IClientValidatable
{
    private readonly string[] _fields;

    public MultiFieldRequiredAttribute(string[] fields)
    {
        _fields = fields;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        foreach (string field in _fields)
        {
            PropertyInfo property = validationContext.ObjectType.GetProperty(field);
            if (property == null)
                return new ValidationResult(string.Format("Property '{0}' is undefined.", field));

            var fieldValue = property.GetValue(validationContext.ObjectInstance, null);

            if (fieldValue == null || String.IsNullOrEmpty(fieldValue.ToString()))
                return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        }

        return null;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "multifield"
        };
    }
}

查看:

@model IndexModel

@using (Html.BeginForm())
{
    @Html.EditorFor(m => m.AreaCode)
    @Html.EditorFor(m => m.PhoneNumber)
    <input type="submit" value="submit" />
}

如果您随后显示视图,则会显示以下区号:

<input class="text-box single-line" data-val="true" data-val-multifield="" id="AreaCode" name="AreaCode" type="text" value="" />

如果您然后单击提交按钮,您将获得以下内容:

<input class="input-validation-error text-box single-line" data-val="true" data-val-multifield="" id="AreaCode" name="AreaCode" type="text" value="" />

单击提交按钮时,会添加input-validation-error

答案 1 :(得分:1)

我原本期望视图中的无效字段会标记属性位置的 .input-validation-error 类方面,所以我使用自定义验证器属性来注释我的模型类像这样:

[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
public class Register
{
        [Display(Name = "Name")]
        public string Name { get; set; }

        [Display(Name = "User name")]
        public string UserName { get; set; }
}

另一方面,如果我注释每个字段:

public class Register
{
        [MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

我的视图在验证摘要中生成多个相同的消息。

所以我最终使用 ValidationSummary 这样有一个自定义验证摘要错误消息:

@Html.ValidationSummary(true, "Please provide all required information")

我的字段用这样的简单星号装饰:

public class Register
{
        [Required(ErrorMessage = "*")]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [Required(ErrorMessage = "*")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

最后,我的视图呈现如下:

Validation error messages

HTH