【问题标题】:Custom validator does not change validated input class自定义验证器不会更改已验证的输入类
【发布时间】:2012-05-18 12:51:04
【问题描述】:

对于多个必填字段的简单验证,我使用了一个自定义验证器,解释了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 类。

【问题讨论】:

  • 如何在视图中输出&lt;input name="ModelName" .../&gt;?请提供您使用的代码。
  • 我更新了这个问题,详细介绍了我的模型以及我如何使用 MultipleFieldsRequired 属性。

标签: asp.net-mvc-3 validation


【解决方案1】:

我刚刚对此进行了测试,它工作正常。这是我所做的:

控制器:

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 被添加。

【讨论】:

  • 感谢您的回答。乍一看,一切正常。但请尝试为 AreaCode 设置一个有效值并将 PhoneNumber 留空。你会得到我上面描述的内容。
  • @ljubomir - 当您在 AreaCode 中输入值而不是 PhoneNumber 时,它会在 AreaCode 字段中报告为错误?你不明白吗?据我所知,这是正确的,因为您没有输入多部分字段的两个部分,因此应该报告错误。如果您希望错误反映在两个字段中,则必须在另一个字段上提供相同的数据注释。我已经更新了答案以反映这一点。你没有得到这些结果吗?
  • 对不起,我离开了我的机器。是的,我有标记有错误类的有效字段,但这正是我想要避免的。我只想标记无效字段并只显示一条错误消息。
  • 感谢您的调查@Dangerous。你让我意识到我手头还有另一个问题。我添加了对最终解决方案的详细说明。
【解决方案2】:

我期望视图中的无效字段将用 .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; }
}

最后,我的视图是这样渲染的:

HTH

【讨论】:

  • 我想知道 mvc 3 中是否存在任何内置属性,称为 MultiFieldRequired 用于验证目的,还是我需要开发它?谢谢
猜你喜欢
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多