ASP.NET MVC 2数值验证

时间:2010-09-14 19:35:44

标签: asp.net-mvc-2 data-annotations

我在课堂上有这个属性:

public virtual decimal? Number { get; set; }

当我在表单上使用它时,MVC会自动验证它。如果用户输入一个字母,则自然会返回错误:

“值'D'对数字无效。”

如何更改此类错误消息甚至控制该行为?我没有找到相关的属性或类似的东西。

谢谢!

2 个答案:

答案 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")]