加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

从ASP.NET中的标准程序集覆盖资源

发布时间:2020-12-16 07:08:34 所属栏目:asp.Net 来源:网络整理
导读:我想覆盖ASP.NET项目的System.ComponentModel.DataAnnotations中的字符串.我是否需要制作附属程序集,搞乱自定义构建任务,al.exe等?即使是,我也找不到如何将.resx转换为.resources以将其提供给al.exe.如果不是,在哪里放.resx.以及如何命名? UPD:说清楚:我
我想覆盖ASP.NET项目的System.ComponentModel.DataAnnotations中的字符串.我是否需要制作附属程序集,搞乱自定义构建任务,al.exe等?即使是,我也找不到如何将.resx转换为.resources以将其提供给al.exe.如果不是,在哪里放.resx.以及如何命名?

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

解决方法

Phil Haack有一篇优秀的文章 Localizing ASP.Net MVC Validation,它专门指导你完成你的字符串.本文适用于DataAnnotations,而不是ASP.net MVC.因此,这将有助于您使用DataAnnotattions.

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

>打开“项目属性”对话框.
>选择“资源”选项卡.
>单击以创建新的默认值
资源文件.
>这将在Properties文件夹中创建两个文件.

> Resources.resx
> Resources.Designer.cs

>当Resources.resx有
打开,更改它的Access Modifier
公开.
>添加你的字符串.

要为特定文化添加其他资源文件,您需要这样做.

>右键单击您的项目
Solution Explorer.
>选择添加 – >新商品 – >资源
文件.
>将其命名为Resources.en-us.resx.
(用适当的替换’en-us’
码)
>单击“添加”
>将其拖到“属性”文件夹中.
>打开Resources.en-us.resx并更改它的Access Modifier
公开.
>添加你的字符串.
>重复您需要的每种文化
支持.

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

有了这个使用声明.

using YourAssembly.Properties;

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

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

注意:我使用Properties文件夹来保持一致性.要使用App_GlobalResources,请在那里移动.resx文件,并更改using语句以匹配目录名称.像这样:

using YourAssembly.App_GlobalResources;

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

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

然后,您可以使用这样的属性进行装饰.

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

要启用自动客户端区域性检测,请将??globalizationsection添加到web.config文件中.

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

在这里,我启用了基于客户的文化,并将文化和养殖设置为“自动”,默认为“en-us”.

创建单独的卫星组件:

MSDN Creating Satellite Assemblies文章也会有所帮助.
如果您不熟悉卫星装配,请务必阅读Packaging and Deploying Resources.

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

>在我的解决方案中创建一个单独的类库项目.
>创建或添加我的.resx文件到此项目.
>将“构建后事件”添加到“项目属性”对话框中. (如下图所示)

示例VS Post-Build脚本:

set RESGEN="C:Program FilesMicrosoft SDKsWindowsv6.0Abinresgen.exe"
set LINKER="C:Program FilesMicrosoft SDKsWindowsv6.0Abinal.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

如果您不想使用ResGen.exe转换.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.您仍然需要使用Assembly Linker.

编辑:正如wRAR提醒我们,如果您正在为您的程序集签名,请输入密钥must match.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读