ValidationSummary(MVC 4)中未显示自定义ValidationAttribute错误

本文关键字:显示 自定义 ValidationAttribute 错误 MVC ValidationSummary | 更新日期: 2023-09-27 18:30:14

我有一个简单的字段,我想确保它大于某个数字。需要注意的事项:

  1. 我无法安装任何其他NuGet软件包
  2. 我想进行服务器端验证
  3. 我想使用下面的自定义验证技术,而不是选择预先存在的解决方案,因为最终我的验证需求将更加复杂,并且特定于应用程序

发生了什么:

  1. 在"小时"文本框中输入-5,然后单击"提交"
  2. 调用GreaterThan的IsValid函数
  3. return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));行被命中(通过使用调试器进行跟踪来确认)
  4. 表单成功发布,并且视图中的ValidationSummary区域中没有出现任何错误

考虑到GreaterThan类确定-5不大于零,我预计在视图中调用ValidationSummary后会出现"必须大于"错误。知道为什么不是这样吗?

这是我的自定义验证类:

public class MyViewModel
{
    [Required]
    [GreaterThan(0)]
    [DisplayName("Hours")]
    public string Hours { get; set; }
}
public class GreaterThan : ValidationAttribute
{
    private readonly float _lowerBound;
    public GreaterThan(int lowerBound) : base("{0} must be greater than " + lowerBound + ".")
    {
        _lowerBound = lowerBound;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            float result;
            if (float.TryParse(value.ToString(), out result) && result > _lowerBound)
            {
                return ValidationResult.Success;
            }
        }
        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }
}

视图:

@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post))
{
    @Html.ValidationSummary()
    <fieldset>
        @Html.LabelFor(m => m.Hours)
        @Html.EditorFor(m => m.Hours)
        <button type="submit">Submit</button>
    </fieldset>
}

行动:

public ActionResult MyAction(MyViewModel model)
{
    try
    {
        // [...] Some irrelevant stuff
        return RedirectToAction("Index", "MyController");
    }
    catch (Exception exception)
    {
        // [...] Handle the exception
        return RedirectToAction("Index", "MyController");
    }
}

ValidationSummary(MVC 4)中未显示自定义ValidationAttribute错误

为什么它是字符串类型?如果你使用decimal或int,你可以节省很多工作。这是一个内置的范围验证。

测距验证代码

[Range(typeof(decimal), "0", "99999", ErrorMessage = "{0} must be between {1} to {2}")]
[Required]
[DisplayName("Hours")]
public decimal Hours { get; set; }