【问题标题】:Customizing model binding error messages in ASP.NET MVC 3在 ASP.NET MVC 3 中自定义模型绑定错误消息
【发布时间】:2011-09-23 04:57:20
【问题描述】:

我正在使用带有 Fluent Validation 的 ASP.NET MVC 3。我希望我的所有错误消息的措辞和格式都相同,无论是验证错误消息还是模型绑定错误消息。

假设我有以下视图模型:

[Validator(typeof(PersonValidator))]
public class Person
{
    [ScaffoldColumn(false)] public int    Id   { get; set; }
                            public string Name { get; set; }
                            public int    Age  { get; set; }
}

要使用 Fluent Validation 来验证这一点,我可能会使用这样的东西:

public class EditorValidator : AbstractValidator<EditorModel>
{
    public EditorValidator()
    {
        RuleFor(model => model.Month.Value).InclusiveBetween(0, 120)
    }
}

如果用户为Age 输入“abc”,这会导致模型绑定 错误,而不是验证 错误。这是因为“abc”不是int。系统甚至不会询问“abc”是否介于 0 和 120 之间,因为“abc”不能存储在 Age 中。

这很好,也很有意义。问题是产生的错误信息是:

年龄字段必须是数字。

我希望消息的格式和措辞与 Fluent Validation 生成的其他错误消息一样。在这种情况下,我想:

“年龄”必须是数字。

我意识到这只是一个细微的差别,但我希望能够控制模型绑定错误消息。

如何自定义模型绑定错误消息以匹配 Fluent Validation 使用的错误消息?

【问题讨论】:

    标签: asp.net-mvc validation asp.net-mvc-3 model-binding fluentvalidation


    【解决方案1】:

    我不确定是否有其他方法可以做到这一点,但我使用Data Annotations Extensions,也可以通过 NuGet (Install-Package DataAnnotationsExtensions.MVC3) 获得这种确切类型的东西。这个包会给你一个IntegerAttribute,你可以从那里指定一个错误消息,如下所示:

    [Integer(ErrorMessage = "'Age' must be a number.")]
    public int Age { get; set; }
    

    【讨论】:

    • +1 用于提供可行的解决方案,但我希望有更集中的解决方案,所以我只能说所有涉及int 属性的错误都应该收到相同的错误,例如string.Format("'{0}' must be a number.", fieldName)
    • 这真的有效吗?我刚刚检查了数据注释扩展项目的源代码并抓取了日期属性的副本并应用了它,但对我来说仍然不起作用?
    • 我刚刚发现它是因为我禁用了客户端验证。所以你仍在设置验证错误消息,而不是绑定错误消息。
    【解决方案2】:

    在这里看看我的回答:

    How to change 'data-val-number' message validation in MVC while it is generated by @Html helper

    实际上,这是您提出的一个非常常见的问题,因此您应该在发布之前搜索一下 stackoverflow。

    【讨论】:

    • 不知何故,除了一个处理本地化的问题并没有完全回答我的问题外,我什么也没遇到。您链接到的问题肯定不会出现在我的任何搜索中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多