重写 ASP.NET 中标准程序集的资源

2023-11-25

我想覆盖 a 中的字符串System.ComponentModel.DataAnnotations对于 ASP.NET 项目。我是否需要制作一个卫星组件,扰乱自定义构建任务,al.exeETC。?即使是,我也找不到如何转换.resx to .resources把它喂给al.exe。如果没有,该放在哪里.resx.以及如何命名它?

UPD:为了明确起见:我想使用自定义资源字符串,而不是程序集中默认资源中的字符串。我不想在使用该字符串的每个地方进行更改。毕竟,资源的存在只是为了覆盖它们。


Phil Haack 有一篇很棒的文章本地化 ASP.Net MVC 验证它专门指导您覆盖字符串。本文更多适用于DataAnnotations比它确实ASP.net MVC。因此,无论您使用什么方式,这都会有所帮助数据注释.

下面我列出了在 Visual Studio 中添加本地化资源的最简单步骤。

  1. 打开Project Properties dialog.
  2. 选择Resources tab.
  3. 点击创建一个新的默认 资源文件.
  4. This will create two files in your Properties folder.
    • 资源.resx
    • 资源.Designer.cs
  5. When 资源.resx有 打开了,改一下Access Modifier to Public.
  6. 添加您的字符串。

添加额外的资源文件 for 特定文化你需要这样做。

  1. 右键单击您的Project in the Solution Explorer.
  2. Select Add -> New Item -> Resource File.
  3. Name it Resources.en-us.resx。 (将“en-us”替换为适当的 代码)
  4. 单击添加
  5. 将其拖入Properties folder.
  6. Open 资源.en-us.resx并改变它Access Modifier to Public.
  7. 添加您的字符串。
  8. 对您需要的每种文化重复上述步骤 支持。

在构建期间 VS 将转换.resx文件到.resource文件并为您构建包装类。然后您可以通过命名空间访问YourAssembly.Properties.Resources.

有了这个 using 语句。

using YourAssembly.Properties;

您可以使用如下属性进行装饰:

[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MyStringName")]

注意:我用的是特性文件夹以保持一致性。要使用 App_GlobalResources 移动您的.resx文件并更改您的 using 语句以匹配目录名称。像这样:

using YourAssembly.App_GlobalResources;

编辑:您可以获得的最接近强类型资源名称的方法是执行以下操作:

public class ResourceNames
{
    public const string EmailRequired = "EmailRequired";
}

然后你可以用这样的属性来装饰。

[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = ResourceNames.EmailRequired)]

要启用自动客户端文化检测,请添加全球化部分 to the 网络配置 file.

<configuration>
    <system.web>
        <globalization enableClientBasedCulture="true" culture="auto:en-us" uiCulture="auto:en-us"/>
    </system.web>
<configuration>

在这里,我启用了基于客户端的文化并设置culture文化 to "auto“ 默认为”en-us".


创建单独的附属组件:

微软软件定义网络创建附属程序集文章也会有帮助。 如果您是卫星组件的新手,请务必阅读打包和部署资源.

过去创建附属程序集时,我发现使用 VS 构建事件很有用。这些是我将采取的步骤。

  1. 创建一个单独的Class Library我的解决方案中的项目。
  2. 创建或添加我的.resx文件到这个项目。
  3. Add a Post-Build Event to the Project Properties对话。 (就像下面这个一样)

示例 VS 构建后脚本:

set RESGEN="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\resgen.exe"
set LINKER="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\al.exe"
set ASSEMBLY=$(TargetName)
set SOURCEDIR=$(ProjectDir)
Set OUTDIR=$(TargetDir)

REM Build Default Culture Resources (en)
%RESGEN% %SOURCEDIR%en\%ASSEMBLY%.en.resx  %SOURCEDIR%en\%ASSEMBLY%.resources

REM Embed Default Culture
%LINKER% /t:lib /embed:%SOURCEDIR%en\%ASSEMBLY%.resources /culture:en /out:%OUTDIR%%ASSEMBLY%.resources.dll
REM Embed English Culture
IF NOT EXIST %OUTDIR%en\ MKDIR $%OUTDIR%en\
%LINKER% /t:lib /embed:%SOURCEDIR%en\%ASSEMBLY%.resources /culture:en /out:%OUTDIR%en\%ASSEMBLY%.resources.dll


REM These are just a byproduct of using the project build event to run the resource build script
IF EXIST %OUTDIR%%ASSEMBLY%.dll DEL %OUTDIR%%ASSEMBLY%.dll
IF EXIST %OUTDIR%%ASSEMBLY%.pdb DEL %OUTDIR%%ASSEMBLY%.pdb

如果您不想使用资源生成器转换你的.resx文件,你可以做这样的事情。

using System;
using System.Collections;
using System.IO;
using System.Resources;

namespace ResXConverter
{
    public class ResxToResource
    {
        public void Convert(string resxPath, string resourcePath)
        {
            using (ResXResourceReader resxReader = new ResXResourceReader(resxPath))
            using (IResourceWriter resWriter = new ResourceWriter(
                    new FileStream(resourcePath, FileMode.Create, FileAccess.Write)))
            {
                foreach (DictionaryEntry entry in resxReader)
                {
                    resWriter.AddResource(entry.Key.ToString(), entry.Value);
                }
                resWriter.Generate();
                resWriter.Close();
            }
        }
    }
}

以这种方式进行转换的潜在缺点之一是需要引用System.Windows.Forms.dll。您仍然需要使用汇编链接器.

编辑:正如 wRAR 提醒我们的那样,如果您正在签署您的程序集您的密钥必须匹配.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重写 ASP.NET 中标准程序集的资源 的相关文章

随机推荐

  • 如何在 Play Framework 2 中调用接受可变数量参数的模板

    Play Framework 2 模板语言非常好 然而 尽管它 受到 微软 Razor 语言的 启发 但一个重要的设计决策是不同的 如何 逃回 HTML Razor 会寻找 HTML 样式的标签 而 Play 2 使用某种启发式方法 我正在
  • 计算第 N 个置换步骤?

    我有一个字母 a z 的 char 26 通过嵌套的 for 语句 我正在生成一个序列列表 例如 aaa aaz aba abb abz zzy zzz 目前 该软件被编写为从 aaa zzz 生成所有可能值的列表 然后维护一个索引 并遍历
  • MATLAB:需要制作 4D 绘图(3D + 颜色/颜色)

    我需要制作一个 3D 表面 其中颜色代表第四个变量 我知道 冲浪 与我需要的类似 但事实并非如此 基本上 我有以下变量 t 1 米 y 1 n a 1 o 这些应该是三个笛卡尔坐标轴 我还有一个变量 S 其尺寸为 m x n x o 基本上
  • 避免脚本中某些参数的混合

    我有一个脚本可以使用获取数十个参数 标志Getopt Long 某些标志不允许混合 例如 linux unix不允许一起供应 我知道我可以使用if陈述 有没有更干净 更好的方法来做到这一点 if如果我不想允许多种标志组合 块可能会变得丑陋
  • C/C++中有复制数组的函数吗?

    我知道Java有一个函数System arraycopy 复制数组 我想知道 C 或 C 中是否有一个函数可以复制数组 我只能找到通过使用复制数组的实现for循环 指针等 但是有没有可以用来复制数组的库函数 既然您要求 C 解决方案 inc
  • 如何使用 JavaScript 将字符串的波斯语和阿拉伯语数字转换为英语?

    如何使用简单的函数将波斯 阿拉伯数字转换为英文数字 arabicNumbers persianNumbers 它是相同的架构 但代码页不同 Oneliner英语 阿拉伯语和波斯语数字之间所有 6 种可能的翻译 警告 请注意 此解决方案效率不
  • Eclipse 为带有“m”后缀的域对象和类成员生成 getter/setter

    我有一个关于域对象中生成的 getter 和 setter 方法的小问题 我想为我的源代码使用通用的样式指南 该风格指南的一部分说 我以成员前缀 m 开头每个类成员名称 class User String mName List
  • 集合 <__NSArrayM: 0x7fa1f2711910> 在枚举时发生突变

    有很多类似标题的问题 但没有一个对我有帮助 但我可以联系这个解决方案 NSGenericException 原因 集合 在枚举时发生了变化用我的问题来提问 因为这个终止正在发生 当我添加 删除带有数组的字符串对象时 Error 由于未捕获的
  • 在Python 3.2中绘制n条边的多边形

    我必须用 Python 编写一个程序来读取值 n 并在屏幕上绘制一个 n 边的多边形 我可以使用海龟图形模块或graphics py 模块 我知道当 n 输入的点数然后在屏幕上单击 n 次时如何绘制多边形 但我在了解如何将多条边转换为多边形
  • 将每隔一行移动到一个新列并将 pandas python 分组

    我有一个示例数据集 它比我的实际数据集小得多 它实际上是一个文本文件 我想将其作为 pandas 表读取并用它做一些事情 import pandas as pd d one title1 R2G title2 K5G title2 R14G
  • C++ - 基于赋值侧重载 [] 运算符

    我正在尝试用 C 编写动态数组模板 我目前正在重载 运算符 并且我想根据它们在赋值的哪一侧使用来实现不同的行为 include
  • 在大写单词开始的每个位置分割字符串

    分割字符串的最佳方法是什么 HELLO there HOW are YOU 通过大写单词 所以我最终会得到一个像这样的数组 results HELLO there HOW are YOU 我努力了 p re compile b A Z 2
  • 三次样条插值的正确实施

    我正在使用其中一种建议的算法 但结果非常糟糕 我实施了维基算法 在Java中 代码如下 x 0 is points get 0 y 0 is values points get 0 is alfa and is mi 其余部分与 wiki
  • 为什么在测试 DateTime 相等性时此单元测试失败?

    在 NET 3 5 上使用 NUnit 2 2 使用 DateTime Equals 时以下测试失败 为什么 TestFixture public class AttributeValueModelTest public class Has
  • 仅更改文本的前6个字符的CSS颜色

    我有这样的短语Client Testimonial我只想改变Client我只用过first letter但是CSS中有没有任何方法可以改变颜色 请不要使用JavaScript 怎么样使用 before 我会将文本从 Client Testi
  • Swing 线程安全编程

    public static void main String args Set the Nimbus look and feel
  • 有没有办法在 Apache htaccess 中进行 if/else 重写?

    我想在 htaccess 文件中创建以下结构 If SITE A DOMAIN or SITE A SUBDOMAIN Rewrite this specific way gt index php 1 else Rewrite this s
  • Azure Service Fabric 在生产服务器上缺少 DLL:FabricCommon.dll

    我创建了一个在开发集群上运行的参与者服务 ASP NET 应用程序 通过 IIS 单独托管 连接到集群并使用参与者 这很好用 但是 当我将所有内容部署到生产环境时 ASP NET 应用程序无法连接到集群 并出现以下异常 该集群托管在本地 W
  • 如何映射到通用类型?

    PageInfoDto
  • 重写 ASP.NET 中标准程序集的资源

    我想覆盖 a 中的字符串System ComponentModel DataAnnotations对于 ASP NET 项目 我是否需要制作一个卫星组件 扰乱自定义构建任务 al exeETC 即使是 我也找不到如何转换 resx to r