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

时间:2014-11-12 22:41:13

标签: c# asp.net-mvc asp.net-mvc-4 data-annotations

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

  1. 我无法安装任何其他NuGet包。
  2. 我想做服务器端验证。
  3. 我想使用以下自定义验证技术,而不是选择预先存在的解决方案,因为最终我的验证需求将更加复杂并且特定于应用程序。
  4. 这里发生了什么:

    1. 在“小时”文本框中输入-5,然后单击“提交”。
    2. 调用GreaterThan的IsValid函数。
    3. 点击return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));行(通过调试器跟踪确认)。
    4. 表单成功发布,并且视图中的ValidationSummary区域中不会显示任何错误。
    5. 我希望"必须大于"在视图中调用ValidationSummary之后出现错误,因为GreaterThan类确定-5不大于零。知道为什么不是这样吗?

      这是我的自定义验证类:

      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");
          }
      }
      

1 个答案:

答案 0 :(得分:0)

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

范围验证代码

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