3

解决方案摘要:核心问题是我的 resx 文件位于 App_LocalResources 和 App_GlobalResources 的子文件夹中。在 .NET 上将内容分离到文件夹中很好,但 Mono 只查看这些文件夹中的文件,而忽略任何子文件夹。

问题 #2 仅在运行时有效。换句话说,资源命名空间可以在 aspx 或页面脚本块的代码中使用,但不能在后面的代码中使用。似乎我从来没有在代码隐藏中使用过 Resources 命名空间,所以我的所有 3 个问题都得到了解决。


我有一个 ASP.NET 应用程序,我以前在 PC 上的 .NET 上工作,现在正试图转移到 Mac 上使用 Mono 和 MonoDevelop 进行开发。该应用程序利用 App_GlobalResources 和 App_LocalResources 文件夹。该应用程序在 .NET 上运行,但在 Mono 上无法正常运行,正如我将概述的那样。版本信息如下:

操作系统:Mac OS 10.8.2 Mono:2.10.9 ASP.NET:4.0.30319.1 MonoDevelop:3.0.5

我已经用 MonoDevelop 标记了它,因为我不确定正在使用什么服务器以及它是 MonoDevelop 的一部分还是 Mono 本身还是单独的。我对 Mono 还不够熟悉,它的组成部分......

我遇到的问题围绕着访问资源,我遇到了各种相关的问题,我将在下面概述:

问题 1:meta:resourcekey 不起作用并且“在指定的虚拟路径中找不到资源对象”。错误

我在应用程序的根目录以及需要页面本地化的子文件夹中都有 App_LocalResources 文件夹和 resx 文件。页面上具有 meta:resourcekey 属性的元素没有为 resx 文件中的相关属性分配值。

例如,我有: /Site/Home.aspx 和 /Site/App_LocalResources/Home 文件夹,其中包含 home.aspx.resx 和相关翻译

注意,当我写这篇文章时,我意识到名称与文件大小写不匹配,但这不是问题,我已经在同一文件夹中的另一个页面上进行了测试,它不会呈现资源值。

有问题的页面后面没有代码。

应用程序根目录中名为 PageNotFound.aspx 的不同页面在 /App_LocalResources/PageNotFound/PageNotFound.aspx.resx 中有相关的 resx 文件

这个页面内容基本如下(如果我去掉两个页面渲染)

<h2><asp:Literal runat="server" meta:resourcekey="PageNotFound" /></h2>
<% string message = GetLocalResourceObject("Sorry.Template").ToString(); %>

无论我删除这些行中的第一行还是第二行,我都会得到相同的错误。错误开始:

System.Resources.MissingManifestResourceException: A resource object was not 
found at the specified virtualPath at
System.Web.Compilation.DefaultResourceProvider.GetLocalResourcesAssembly

如果我删除第一行实际上是构建并尝试呈现页面但崩溃并给出上述错误。

如果我删除第二行,我也会收到错误,但这是在解析页面并且运行时正在尝试构建页面类时。

因此,对于一个页面似乎使用 meta:resourcekey 属性构建和运行,但没有将资源值绑定到底层控件的属性,在另一个页面上,它似乎在尝试访问资源时崩溃。奇怪的是,崩溃的页面是一个非常简单的页面,没有母版页,它基本上只有上述内容,另一个页面相当复杂,有一个母版页,它呈现(即没有解析器错误)但没有 resourcekey 值分配……

我能看到的唯一区别是一个页面在根目录中并且没有母版页,另一个在子文件夹中并且有母版页?去搞清楚!有任何想法吗?

问题 2:资源命名空间不存在

如果我访问使用 .NET 中可用的“资源”命名空间的页面,我会收到运行时编译错误,就像编译时应用程序构建一样,但是当页面被解析和编译时,它会导致(运行时)异常。 ..

Compilation Error: CS0103: The name 'Resources' does not exist in the current context

代码将在后面的代码中:(编辑:我认为以下行是我在测试,我的代码从不在代码后面(编译时)类中使用此命名空间。一旦全局资源运行,命名空间在运行时工作,但不是在问题顶部的摘要中概述的需要在编译时验证命名空间的情况下)

msg.Subject = Resources.EmailResources.Request_SubjectLine

或在 aspx 本身的脚本块中,即

<%= Resources.EmailResources.Request_SubjectLine %>

对 Resources 命名空间的这些类型的访问都不起作用。为什么这在 Mono 中不起作用。Mono 框架不会像 .NET 那样为我们生成这些东西吗?(我相当肯定这个命名空间层次结构是由 .NET 上的 ASP.NET 框架生成的,因此想知道这是否还没有在 Mono 中实现?)

问题 3:GetGlobalResourceObject(...) 调用返回 Null

在代码隐藏中,我调用了在 .NET 上运行的 GetGlobalResourceObject(),但是当我在 Mono 上运行它时,我的代码抛出了异常。例如:

hlContact.Text = GetGlobalResourceObject("CommonResources", "Contact").ToString();

我的文件夹结构是:App_GlobalResources > CommonResources > CommonResources.resx 并且设计器文件 (CommonResources.Designer.cs) 在那里。

resx 文件都标有“EmbeddedResource”的构建操作,“请勿复制”使用自定义工具“GlobalResourceProxyGenerator”,并具有对每个文件有意义的资源 ID。(即.App_GlobalResources.CommonResources)

问题是 GetGlobalResourceObject() 返回 null ......它没有找到 CommonResources 资源......

请注意,Mono 正在使用 resx 文件的文件夹中构建“*.resource”文件。

4

1 回答 1

3

问题 #1

显然 mono 不会在子目录中搜索资源,也就是说,您必须将它们直接保存在App_LocalResourcesor中App_GlobalResources。请参阅单声道源代码中的相关部分(第 134 行)。如果搜索子目录是官方功能,那么这是一个错误,可以通过更改上述行轻松修复。


问题 #2

在这里工作正常(在linux上)。


问题 #3

我不知道您是如何嵌入资源的,一个小型测试项目会有所帮助。对于App_GlobalResources框架在运行时编译它们,然后GetGlobalResourceObject也可以正常工作。

于 2012-11-24T04:02:18.503 回答