我在课堂上有这个属性:
public virtual decimal? Number { get; set; }
当我在表单上使用它时,MVC会自动验证它。如果用户输入一个字母,则自然会返回错误:
“值'D'对数字无效。”
如何更改此类错误消息甚至控制该行为?我没有找到相关的属性或类似的东西。
谢谢!
答案 0 :(得分:0)
它实际上不是源自模型验证的消息。当模型绑定器无法将输入值转换为绑定属性的值类型时,消息将添加到模型状态。例如,当bound属性为整数且用户在该属性的输入字段中输入非数字字符时,可能会发生这种情况。
要覆盖该消息,您不幸地必须以“硬”方式执行此操作,即扩展DefaultModelBinder类并覆盖SetProperty方法。这是一个例子:
public class MyModelBinder: DefaultModelBinder
{
public MyModelBinder()
{
}
protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
{
string key = bindingContext.ModelName + "." + propertyDescriptor.Name;
if (bindingContext.ModelState[key] != null)
{
foreach (ModelError error in bindingContext.ModelState[key].Errors)
{
if (IsFormatException(error.Exception))
{
bindingContext.ModelState[key].Errors.Remove(error);
bindingContext.ModelState[key].Errors.Add(string.Format("My message for {0}.", propertyDescriptor.DisplayName));
break;
}
}
}
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
}
private bool IsFormatException(Exception e)
{
while (e != null)
{
if (e is FormatException)
{
return true;
}
e = e.InnerException;
}
return false;
}
}
答案 1 :(得分:0)
简单使用给定范围验证器基础,你会得到你想要的
对于任何数字验证,您必须根据您的要求使用不同的范围验证:
For Integer
[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]
for float
[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]
表示双重
[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]