ValidationSummary(MVC 4)中未显示自定义ValidationAttribute错误
本文关键字:显示 自定义 ValidationAttribute 错误 MVC ValidationSummary | 更新日期: 2023-09-27 18:30:14
我有一个简单的字段,我想确保它大于某个数字。需要注意的事项:
- 我无法安装任何其他NuGet软件包
- 我想进行服务器端验证
- 我想使用下面的自定义验证技术,而不是选择预先存在的解决方案,因为最终我的验证需求将更加复杂,并且特定于应用程序
发生了什么:
- 在"小时"文本框中输入-5,然后单击"提交"
- 调用GreaterThan的IsValid函数
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
行被命中(通过使用调试器进行跟踪来确认)- 表单成功发布,并且视图中的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");
}
}
为什么它是字符串类型?如果你使用decimal或int,你可以节省很多工作。这是一个内置的范围验证。
测距验证代码
[Range(typeof(decimal), "0", "99999", ErrorMessage = "{0} must be between {1} to {2}")]
[Required]
[DisplayName("Hours")]
public decimal Hours { get; set; }