如何更改 ASP.NET MVC 中 int 模型验证的 ErrorMessage?

Posted

技术标签:

【中文标题】如何更改 ASP.NET MVC 中 int 模型验证的 ErrorMessage?【英文标题】:How to change the ErrorMessage for int model validation in ASP.NET MVC? 【发布时间】: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 时,我可以使用一个属性来覆盖默认错误消息吗?

【问题讨论】:

【参考方案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

【讨论】:

你错过了一个结束)。

以上是关于如何更改 ASP.NET MVC 中 int 模型验证的 ErrorMessage?的主要内容,如果未能解决你的问题,请参考以下文章

如何继承 ASP.NET MVC 控制器并仅更改视图?

无法更改 ASP.NET MVC 3 中文本框的值

在 MVC 中更改模型后如何更改数据库?

如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?

如何在 ASP.Net MVC Identity 2 中更改密码验证?

ASP.Net MVC:如何显示模型中的字节数组图像