ASP.NET MVC 2 数值验证

发布于 2024-09-19 00:21:41 字数 246 浏览 4 评论 0原文

我在一个类上有这个属性:

public virtual decimal? Number { get; set; }

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

“The value 'D' is not valid for Number”。

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

谢谢你!

I have this property on a class:

public virtual decimal? Number { get; set; }

When I'm using it on a form, MVC validates it automatically. If the user enters a letter, naturally an error is returned:

"The value 'D' is not valid for Number."

How do I change such error message or even control that behavior? I'm not finding the related attribute or something like that.

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ら栖息 2024-09-26 00:21:41

它实际上不是来自模型验证的消息。当模型绑定器无法将输入值转换为绑定属性的值类型时,该消息将添加到模型状态。例如,当绑定属性是整数并且用户在该属性的输入字段中输入非数字字符时,可能会发生这种情况。

不幸的是,要覆盖该消息,您必须采用“硬”方式,即扩展 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;
    }
}

It is actually not a message that derives from model validation. The message is added to the model state when the model binder is unable to convert an input value to the value type of the bound property. This may for example occur when the bound property is an integer and the user entered a non-numeric character in the input field of that property.

To override the message you'll unfortunately have to do it the "hard" way, i.e. extend the DefaultModelBinder class and override the SetProperty method. Here is an example:

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;
    }
}
无力看清 2024-09-26 00:21:41

简单地使用给定范围验证器基础,您将得到您想要的

对于任何数字验证,您必须根据您的要求使用不同的不同范围验证:

对于整数

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

对于浮点数

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

对于双精度

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]

simple use given range validator funda and you will get what you want

For any number validation you have to use different different range validation as per your requirements :

For Integer

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

for float

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

for double

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文