【发布时间】:2014-08-08 10:56:12
【问题描述】:
我正在尝试基于此MSDN article 推出我自己的 DBResourceProviderFactory。
我下载了代码并打开了解决方案。首先,我不想要单独的解决方案。资源提供者应该在我的 Web 应用程序中。所以我将所有代码文件(DBResourceProviderFactory.cs DBResourceProvider.cs StringResourcesDALC.cs ...)复制到我的项目中并更正了命名空间,修复了本地资源并相应地编辑了 DALC 中的连接字符串。
在 web.config 中我添加了这个全局配置:
<system.web>
<!--If MyApllicationNamespace is ommited, exception is thrown at runtime.-->
<globalization culture="auto" uiCulture="auto" resourceProviderFactoryType="MyApplicationNamespace.DBResourceProviderFactory" />
</system.web>
在 default.aspx 我添加了这个标签:
<asp:Label ID="lblHello" runat="server" Text="not translated" meta:resourceKey="lblHello"></asp:Label>
数据库表包含此资源的 3 行数据。
在构建应用程序并在浏览器中运行它时,标签会保持其初始文本“未翻译”,并且我在 DBResourceProdivder 类中设置的所有断点都不会被命中,因此永远不会调用代码。
我的问题是:为什么它从来没有被调用过?
附加信息: 存在2个标签,在数据库中有对应的resourceKeys
<asp:Label ID="lblHello" runat="server" Text="HelloDefault" meta:resourcekey="lblHello" />
<asp:Label ID="lblGoodbye" runat="server" Text="GoodByeDefault" meta:resourcekey="lblGoodbye" />
ResourceType | CultureCode | ResourceKey | ResourceValue
---------------------------------------------------------------
Default.aspx | de-DE |lblHello.Text | Hallo (de-DE)
Default.aspx | en-US |lblHello.Text | Hello (en-US)
Default.aspx | fr-FR |lblHello.Text | Bonjour (fr-FR)
Default.aspx | en |lblHello.Text | Hello (en)
Default.aspx | de-DE |lblGoodbye.Text | Tschüss (de-DE)
Default.aspx | en-US |lblGoodbye.Text | good bye(en-US)
由于某种原因(我不知道为什么)lblHello 被正确本地化,而 lblGoodbye 没有。
我也可以写<asp:label id="lblhello" runat="server" text="<%$ resources: default.aspx, lblhello.text %>" />。这也有效。
在GetObject方法中,有一行调试器:
Debug.WriteLine(String.Format(CultureInfo.InvariantCulture, "DBResourceProvider.GetObject({0}, {1}) - type:{2}", resourceKey, culture, this.m_classKey));
如果客户端调用 Default.aspx,则此行会出现在输出窗口中:
DBResourceProvider.GetObject(lblhello.Text, ) - type:Default.aspx
但是对于 lblGoodbye,没有调用 DBResourceProvider,这很奇怪。好像没有注册新标签,或者没有读取元标记。
更新: 我已经阅读了更多有关该主题的内容。显然,资源被缓存并且在应用程序关闭之前不会被释放。在我的书中,这意味着 AppDomain 被回收。我读过的每个资源都提供了重新加载 AppDomain 的相同方法:
- 更改
Bin文件夹的内容(添加一个txt文件f.e.) - 通过插入换行符或更改上次修改日期来更改 web.config。
- 通过更改
system.web或trust部分来更改 web.config HttpRuntime.UnloadAppDomain()- 清除当前 Http 当前上下文的 asp.net 应用程序缓存
- 删除 /AppData/... 文件夹中的临时 asp.net 数据
我已经尝试了所有方法,但我无法强制环境转储每个临时文件/缓存位,它必须重新加载资源并正确显示它们。我的问题不是 Resourceprovider 没有被调用,而是资源被无限缓存并且没有被正确刷新。
【问题讨论】:
-
IISreset 无效。我将提取数据并将其编辑为我的问题。
-
这与我的问题有什么关系?
-
明确一点:我不知道
lblHello现在正在工作。星期五,当我离开办公室时,它没有。而且我不知道为什么 lblGoodBye 不起作用。我所知道的是:如果我从后面的代码中设置属性,它就可以工作。将 [assembly: NeutralResourcesLanguage("en-US")] 注入自定义提供程序不会改变任何东西,我可以即时发现 -
是的 - 它在美国。如果我将其切换为德语,则为 de-DE。
-
正确。它显示
.Text属性中指定的默认文本,除非我在后面的代码中设置this.lblGoodbye.Text = GetLocalResourceObject("lblGoodbye.Text") as string;。
标签: c# asp.net globalization