ASP.NET Core 模型绑定错误消息本地化

2023-11-23

我正在使用 ASP.NET Core,并尝试本地化该应用程序。我设法使用new用于本地化控制器和视图的 asp .net core 资源,以及old用于本地化模型验证错误消息的资源。 但是,当错误消息未链接到模型字段注释(如“必需”)并且模型绑定的数据不正确(如需要数字的文本)时,我会收到如下错误,我是无法本地化:

“值‘abc’对于 ID 无效。”

当我进入abc for ID财产在View,因为无法对字段进行模型绑定,并且它在字段附近显示一条验证消息,说“值‘abc’对于 ID 无效。”。这是我正在使用的类:

public class Country : IHasID
{
    public int ID { get; set; }

    [Required(ErrorMessageResourceType = typeof(L.Val),
    ErrorMessageResourceName = "NameR")]
    [MaxLength(100, ErrorMessageResourceType = typeof(L.Val), 
    ErrorMessageResourceName = "Max")]
    public string Name { get; set; }

    /*Some other properties*/
}

我在互联网上发现的类似问题要么是针对较旧的asp .net版本,要么没有帮助我解决问题。


自定义框架模型绑定错误消息,需要为不同的错误消息访问器设置自定义访问器ModelBindingMessageProvider.

Example

您可以在这里下载本文中描述的完整源代码。该存储库包含示例ASP.NET Core 2.0(VS 2017.3) and ASP.NET Core 1.1(VS 2015):

  • r-aghaei/AspNetCoreLocalizationSample

您还可以在这里看到示例:

  • aspnetcore 本地化示例 www.azurewebsites.net

默认错误消息

这些是当模型绑定到属性失败时框架显示的默认错误消息:

MissingBindRequiredValueAccessor    A value for the '{0}' property was not provided.
MissingKeyOrValueAccessor           A value is required.
ValueMustNotBeNullAccessor          The value '{0}' is invalid. 
AttemptedValueIsInvalidAccessor     The value '{0}' is not valid for {1}.
UnknownValueIsInvalidAccessor       The supplied value is invalid for {0}.
ValueIsInvalidAccessor              The value '{0}' is invalid.
ValueMustBeANumberAccessor          The field {0} must be a number.

除了上述消息之外,ASP.NET Core 2.0 还具有以下消息:

MissingRequestBodyRequiredValueAccessor       A non-empty request body is required.
NonPropertyAttemptedValueIsInvalidAccessor    The value '{0}' is not valid.
NonPropertyUnknownValueIsInvalidAccessor      The supplied value is invalid.
NonPropertyValueMustBeANumberAccessor         The field must be a number.

本地化 ASP.NET Core 模型绑定错误消息

要本地化 ASP.NET Core 模型绑定错误消息,请按照下列步骤操作:

  1. 创建资源文件- 在下面创建一个资源文件资源解决方案中的文件夹并命名该文件模型绑定消息.fa.resx。该名称可以是其他任何名称,但我们将使用它来创建本地化器。在示例中,我使用了fa(波斯)文化。

  2. 添加资源键- 打开资源文件并添加要用于本地化错误消息的键和值。我使用了如下图所示的键和值:

    enter image description here

    我使用的密钥就像原始消息一样,除了密钥ValueMustNotBeNull这与ValueIsInvalid,所以我用了空值无效。 for it.

  3. 配置选项 - In ConfigureServices方法,添加时Mvc,配置其选项以设置消息访问器ModelBindingMessageProvider:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLocalization(options => { options.ResourcesPath = "Resources"; });
        services.AddMvc(options =>
        {
            var F = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
            var L = F.Create("ModelBindingMessages", "AspNetCoreLocalizationSample");
            options.ModelBindingMessageProvider.ValueIsInvalidAccessor =
                (x) => L["The value '{0}' is invalid.", x];
            options.ModelBindingMessageProvider.ValueMustBeANumberAccessor =
                (x) => L["The field {0} must be a number.", x];
            options.ModelBindingMessageProvider.MissingBindRequiredValueAccessor =
                (x) => L["A value for the '{0}' property was not provided.", x];
            options.ModelBindingMessageProvider.AttemptedValueIsInvalidAccessor =
                (x, y) => L["The value '{0}' is not valid for {1}.", x, y];
            options.ModelBindingMessageProvider.MissingKeyOrValueAccessor =
                () => L["A value is required."];
            options.ModelBindingMessageProvider.UnknownValueIsInvalidAccessor =
                (x) => L["The supplied value is invalid for {0}.", x];
            options.ModelBindingMessageProvider.ValueMustNotBeNullAccessor =
                (x) => L["Null value is invalid.", x];
        })
        .AddDataAnnotationsLocalization()
        .AddViewLocalization();
        services.Configure<RequestLocalizationOptions>(options =>
        {
            var supportedCultures = new[]{new CultureInfo("en"), new CultureInfo("fa")};
            options.DefaultRequestCulture = new RequestCulture("en", "en");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
        });
    }
    

    还要在开头添加此代码Configure method:

    var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("fa") };
    app.UseRequestLocalization(new RequestLocalizationOptions()
    {
        DefaultRequestCulture = new RequestCulture(new CultureInfo("en")),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures
    });
    

ASP.NET Core 2.0 的重要说明

在 ASP.NET Core 2.0 中,模型绑定消息提供程序属性已得到 只读,但已添加每个属性的 setter 方法。

例如,设置ValueIsInvalidAccessor,你应该使用SetValueIsInvalidAccessor()方法如下:

options.ModelBindingMessageProvider.SetValueIsInvalidAccessor (
    (x) => L["The value '{0}' is invalid.", x]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Core 模型绑定错误消息本地化 的相关文章

随机推荐

  • PHP 中如何实现分页? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 PHP 中通常如何实现分页结果 我想要一个包含 10 个结果的结果页面 在导航中向前翻页将显示下一组和上一组 有没有一种常见的方法 有人对入门有简单的建议吗 您需要对 PHP 有一定
  • 如何用前 n 个级别(通过某些指标)以及 [其他] 替换因子级别?

    对于在图表中着色的级别数超过合理数量的因素 我想用 其他 替换不在 前 10 个 中的任何级别 替代问题 如何将因子水平减少到 rcolorbrewer 可以绘制为单独颜色的数量 例如 如果我想从棒球数据中绘制每十年的本垒打数量 requi
  • PyQt QWidget 窗口显示后立即关闭?

    我意识到这个问题之前已经被问过好几次了 尽管它们似乎都不适用于我的情况 我已经安装了 PyQt 并且只是尝试打开一个窗口 如下所示 import sys from PyQt4 import QtGui as qt segmentation
  • 一直异步问题

    我有一个异步 asp net 控制器 该控制器调用异步方法 实际执行异步 IO 工作的方法在我的应用程序的深处 控制器和链中最后一个方法之间的一系列方法都用 async 修饰符标记 这是我如何设置代码的示例 public async Tas
  • 编辑(更新、删除)空手道中的标题之一

    我有这个标题 它位于 js文件 我正在使用读取此标头 configure headers read classpath services Headers distheader js 问题 1 如何使用场景数据在运行时编辑此文件中的标头之一
  • Mongodb C# 驱动程序和 ISODate

    我通过了以下测试 namespace MongoDateTest TestFixture public class DateTesting public class TestEntity public string Id get set p
  • 我想用 javascript 将链接延迟 500 秒

    我一直在浏览 Stackoverflow 的问题 试图获得有关简单链接延迟的帮助 我想把它放在 div 周围 但我无法弄清楚我找到的示例 到目前为止 我知道我需要停止 href 的本机功能 但我不知道该怎么做 该代码对我来说仍然很陌生 帮助
  • 从另一个类调用表单类中的函数,C# .NET

    有人可以通过一些代码让我知道如何从另一个类调用位于 Form 类中的函数吗 一些代码会有很大帮助 thanks 编辑 这是我当前的代码 public partial class frmMain Form Class Instances Im
  • 关于默认的 C 结构体值,这段代码怎么样?

    我正在尝试创建具有默认值的结构 我不知道如何实现这一点 因为我看到的每个代码都是关于初始化的 我会以自然的方式进行 例如 struct stuff int stuff a 1 int stuff b 2 and so on 环顾四周 我发现
  • 如何从webapp2中的cookies/headers/session决定语言?

    我想利用 webapp2 的新本地化功能 该功能还具有特定于区域设置的时间和货币格式 Django 有一个很好的函数 名为 get language from request 我在完全迁移到 webapp2 之前就使用了该函数 现在我使用
  • 使用结构标识符来表示 POD 类型和 C 结构

    考虑下面的代码 struct Foo template
  • 在 nginx 中使用别名作为相对 url 时的禁止位置

    我正在尝试使用 Nginx 在相对 URL 上设置 roundcube phpldapadmin 例如 example com roundcube example com phpldapadmin 源位于以下文件夹中 var www rou
  • 如何使用 Javascript 在 Safari 中生成按键事件?

    如何以编程方式从 Safari 中运行的 Javascript 代码生成按键事件 看起来 WebKit 使用 DOM level 3 模型从 Javascript 创建键盘事件 而 DOM level 3 键盘事件模型不支持按键事件 我可以
  • 如果我只对一些样本进行转发,什么时候计算图会被释放?

    我有一个用例 我对批次中的每个样本进行转发 并且仅根据样本模型输出的某些条件累积某些样本的损失 这是一个说明性代码 for batch idx data target in enumerate train loader optimizer
  • python Pipes 的同步/异步行为

    在我的应用程序中 我使用多处理模块中的管道在 python 进程之间进行通信 最近 我观察到一种奇怪的行为 具体取决于我通过它们发送的数据大小 根据 python 文档 这些管道基于连接 并且应该以异步方式运行 但有时它们在发送时会卡住 如
  • python 矩阵转置和zip

    如何获得这个矩阵的转置 任何更简单的算法方法来做到这一点 第一个问题 Input a 1 2 3 4 5 6 7 8 9 Expected output a 1 4 7 2 5 8 3 6 9 第二个问题 Zip 给了我下面的输出 当我不知
  • SQLAlchemy 克隆具有关系的表行

    继这个问题之后SQLAlchemy 分离对象的修改 这使得对象的副本很好 但它丢失了原始对象具有的任何多对多关系 有没有办法复制对象以及任何多对多关系 Cheers 我通过遍历对象图并对图中的每个对象执行 expunge make tran
  • 使用 Delphi 进行 JNI 编程

    我可以用Delphi来编程吗Java 本机接口 来自阅读基本 JNI如果您确保使用 C 调用约定 这似乎是可能的 以前有人这样做过吗 我希望得到有关工具的提示 这些工具将有帮助 例如一个将Javah的C头文件转换为Delphi的工具 您可以
  • 文本缩进不适用于锚标记

    http jsfiddle net corinem TtPgy 我在用着 a href Lorem ipsum dolor a css a text indent 9999px 但这行不通 例如 当我使用另一个标签时 p 有用 我也尝试添加
  • ASP.NET Core 模型绑定错误消息本地化

    我正在使用 ASP NET Core 并尝试本地化该应用程序 我设法使用new用于本地化控制器和视图的 asp net core 资源 以及old用于本地化模型验证错误消息的资源 但是 当错误消息未链接到模型字段注释 如 必需 并且模型绑定