在单一资源访问错误上运行ASP.NET

时间:2012-11-24 00:58:24

标签: macos mono monodevelop asp.net-4.0

Solutons摘要 :核心问题是我将我的resx文件放在App_LocalResources和App_GlobalResources中的子文件夹中。将东西分成文件夹在.NET上是可以的,但Mono只查看那些文件夹中忽略任何子文件夹的文件。

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


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

操作系统:Mac OS 10.8.2 单声道: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及相关翻译

N.B。在我写这篇文章的过程中,我意识到名称与文件大小写不匹配,但这不是问题,我已经在同一个文件夹中的另一个页面进行了测试,但它没有渲染超出资源价值。

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

名为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:资源名称空间不存在

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

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

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

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&gt; CommonResources&gt; CommonResources.resx和设计器文件(CommonResources.Designer.cs)就在那里。

resx文件都标有&#34; EmbeddedResource&#34;的构建操作,&#34;不要复制&#34;使用自定义工具&#34; GlobalResourceProxyGenerator&#34;并拥有一个对每个文件都有意义的资源ID。 (即.App_GlobalResources.CommonResources)

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

请注意,Mono正在构建&#39; *。resource&#39;包含resx文件的文件夹中的文件。

1 个答案:

答案 0 :(得分:3)

问题#1

显然,mono不会在子目录中搜索资源,也就是说您必须将它们直接保存在App_LocalResourcesApp_GlobalResources中。请参阅relevant part in the mono source code(第134行)。如果搜索子目录是一个官方功能,那么这是一个错误,可以通过更改上述行轻松修复。


问题#2

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


问题#3

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