【问题标题】:How to use .resx and .resource files in custom server control asp?如何在自定义服务器控件 asp 中使用 .resx 和 .resource 文件?
【发布时间】:2012-10-28 19:37:00
【问题描述】:

我正在编写自己的服务器端控件,并且正在使用存储在.resx 文件中的图像。在控制台应用程序中,这段代码运行良好:

     ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx");
        
     foreach (DictionaryEntry d in rsxr)
     {
        Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
     }

     rsxr.Close();

这里

      protected override void RenderContents(HtmlTextWriter output)
    {
        ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx");
  
        base.RenderContents(output);

        foreach (DictionaryEntry d in rsxr)
        {
            output.Write(d.Key.ToString());
        }
        
    }

我收到此错误:

找不到文件'C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\Resource1.resx'

我尝试使用 ResourceManager,但它需要一个 .resource 文件。我无法访问resgen 工具(命令提示符不理解resgen 命令)并安装它(在尝试期间出现了一些错误)。

我的问题是:

  1. 为什么我看不懂.resx

  2. 如何正确安装resgen工具?

谢谢。

【问题讨论】:

  • 前段时间你问过这个问题,但我为你找到了解决方案。

标签: c# asp.net resx resgen


【解决方案1】:

将资源文件存储在应用程序根目录中的App_GlobalResources 文件夹下或与用户控制文件同名的App_LocalResources 是一种很好的做法。因此,例如用户用户控件是 uc.ascx 本地资源文件夹中的文件应该是 uc.ascx.resx。这样更容易维护,asp.net 会自动检测到它。

现在你的答案:

第一个问题: 使用Server.MapPath("~/") 直接指向您的web.config 所在的物理位置。如果你想使用 Controls 文件夹中的资源文件,你必须写 Server.MapPath("~/Controls/Resource1.resx") 来获取路径。

不确定你想用 resgen 工具做什么?当你编译你的应用程序时,资源文件也将被编译。选择您的资源文件并单击 F4,它将显示构建操作,在构建操作中选择资源,您的资源文件将包含在程序集中。

您可以查看此帖子以获取更多信息:How to use image resource in asp.net website?

【讨论】:

  • 好的。我为我的 .resx 文件使用 [embeded resource] 选项。那么你应该解释为什么这段代码给出(在控制台应用程序中) MissingManifestResourceException [code] ResourceManager resourceManager = new ResourceManager("ConsoleApplication1.Resource1 .resx", GetType().Assembly);对象 a = resourceManager.GetObject("line.gif"); [/code]
【解决方案2】:

根据您的描述,我了解到您需要找到并访问用户控件的资源文件。我发现它通过以下方式很好地工作:

  1. 在项目级别创建一个App_GlobalResources(通过上下文菜单Add -> Add ASP.NET Folder -> App_GlobalResources

  2. 创建与控件同名的资源文件,但在 App_GlobalResources 内。例如,如果控件名为myControl.ascx,则默认语言的资源文件名称必须为myControl.ascx.resx

  3. 为您需要的每种语言创建额外的资源文件。例如,如果您需要德语(“de-DE”),则添加 myControl.ascx.de.resx

  4. 添加类MultiLanguageUserControl如下:

    public class MultiLanguageUserControl : System.Web.UI.UserControl
    {
        public string getResValue(string id)
        {
            var ctrlPath = TemplateControl.AppRelativeVirtualPath;
            var ctrlFile = System.IO.Path.GetFileName(ctrlPath);
            var resObj = GetGlobalResourceObject(ctrlFile, id);
            if (resObj!=null)
                        return resObj.ToString();
            else
                        return string.Format("UNRESOLVED[{0}]", id);        
        }
    }
    
  5. 打开myControl后面的代码,让它继承自MultiLanguageUserControl而不是System.Web.UI.UserControl

    public partial class myControl : MultiLanguageUserControl { //... }

  6. 在 HTML 代码中,使用新函数,例如:<%=getResValue("resid")%>,其中"resid" 是您要查找的资源字符串的名称。您还可以使用 HTML 编码标记 <%: 代替 <%=,具体取决于您的要求。或者,您可以在用户控件的服务器端 C# 代码中的任何位置使用 getResValue 从资源文件中检索值。

  7. 确保您支持页面的Page_Load 事件中的语言检测,该事件使用用户控件。 here 描述了如何做到这一点(查找函数 InitializeCulture)。

注意:如果您想从用户控件内部读取页面的本地资源字符串,请查看here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多