【问题标题】:How to change the ErrorMessage for int model validation in ASP.NET MVC?如何更改 ASP.NET MVC 中 int 模型验证的 ErrorMessage?
【发布时间】:2011-09-29 02:11:09
【问题描述】:

我有一个模型,其属性定义如下:

    [Required(ErrorMessage="Please enter how many Stream Entries are displayed per page.")]
    [Range(0,250, ErrorMessage="Please enter a number between 0 and 250.")]
    [Column]
    public int StreamEntriesPerPage { get; set; }

除非用户输入“100q”之类的内容,否则此方法有效。然后显示一个相当丑陋的错误,显示“值 '100q' 对 StreamEntriesPerPage 无效。”

当输入不是 int 时,我可以使用一个属性来覆盖默认错误消息吗?

【问题讨论】:

    标签: c# asp.net-mvc validation


    【解决方案1】:

    是的,您可以使用Data annotations extensions,将您的属性标记如下:

    [Required(ErrorMessage = "Please enter how many Stream Entries are displayed per page.")]
    [Range(0, 250, ErrorMessage = "Please enter a number between 0 and 250.")]
    [Column]
    [DataAnnotationsExtensions.Integer(ErrorMessage = "Please enter a valid number.")]
    public int StreamEntriesPerPage { get; set; }
    

    【讨论】:

    • 不喜欢使用第三方软件来做这么小的事情。
    • 链接失效
    【解决方案2】:

    尝试添加

    [RegularExpression("\\d+", ErrorMessage = "some message here")]
    

    Reference blog post

    【讨论】:

    • 似乎不起作用,我仍然得到默认的错误文本。
    • 似乎默认整数验证具有更高的优先级。
    【解决方案3】:

    很像 Feras 的建议,但没有外部依赖:

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace MyDataAnnotations
    {
        [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
        public class IntegerAttribute : DataTypeAttribute
        {
            public IntegerAttribute()
                : base("integer")
            {
            }
    
            public override string FormatErrorMessage(string name)
            {
                if (ErrorMessage == null && ErrorMessageResourceName == null)
                {
                    ErrorMessage = "Enter an integer"; // default message
                }
    
                return base.FormatErrorMessage(name);
            }
    
            public override bool IsValid(object value)
            {
                if (value == null) return true;
    
                int retNum;
    
                return int.TryParse(Convert.ToString(value), out retNum);
            }
        }
    }
    

    然后您可以使用[Integer(ErrorMessage="...")] 属性进行装饰。

    【讨论】:

    • 这看起来很酷。您是否有任何资源可供我浏览以获取有关从 DatatTypeAtribute 继承的信息?
    • 这似乎没有任何作用。我创建了名称空间和具有覆盖的类。然后,我在模型类上使用了命名空间并添加了[Integer(ErrorMessage="Please enter a whole number.")]。当我输入 '20d' 时,我仍然得到“值 '20d' 对 StreamEntriesPerPage 无效。”
    • 如果我在模型中使用int 作为数据类型(value 的值始终为null),它也对我不起作用。虽然如果我使用string 而不是int,它会按预期工作,可能有什么问题?
    【解决方案4】:

    我遇到了同样的问题,这个解决方案解决了它:

    • 为您的项目创建App_GlobalResources 文件夹(右键单击项目 -> 添加 -> 添加 ASP.NET 文件夹 -> App_GlobalResources)。
    • 在该文件夹中添加一个 resx 文件。说MyNewResource.resx
    • 使用所需的消息格式添加资源键 PropertyValueInvalid(例如,“内容 {0} 对字段 {1} 无效”)。如果您想更改 PropertyValueRequired 也可以添加它。
    • 将代码 DefaultModelBinder.ResourceClassKey = "MyNewResource" 添加到您的 Global.asax 启动代码中。

    来自: How to change default validation error message in ASP.NET MVC?

    【讨论】:

      【解决方案5】:

      试试这个:

      [DataType(DataType.Currency, ErrorMessage ="......")]
      public int YourProperty { get; set; }
      

      【讨论】:

      • 这对我不起作用。仍然收到 Out of box 错误消息“Not a valid number”
      【解决方案6】:

      ErrorMessage 不适用于我的范围属性。我最终使用了正则表达式属性。

      代替:

      [Range(0, 9, ErrorMessage = "...")]
      public int SomeProperty { get; set; }
      

      我用过:

      [RegularExpression("^[0-9]$", ErrorMessage = "..."]
      public int SomeProperty { get; set; }
      

      您可以在以下位置找到其他范围等的正则表达式模式:https://www.regular-expressions.info/numericranges.html

      【讨论】:

      • 你错过了一个结束)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多