为什么这种本地化行为会这样?

时间:2011-02-16 15:56:30

标签: c# asp.net localization expressionbuilder

我正在本地化一个ASP.NET网站。通常在.aspx页面中本地化文本我只使用

<%= Resources.ResourceFile.ResourceName %>

对于asp.net控件,这不起作用。我必须使用语法

<%$ Resources:ResourceFile, ResourceName %>

但是,如果我有一个按钮并以这种方式本地化Text属性,但在其后添加任何其他字符,则本地化会中断并显示为纯文本。

所以Text="<%$ Resources:ResourceFile, ResourceName %> &raquo;"显示为
&lt;%$ Resources:ResourceFile,ResourceName%&gt; »

我确定这是有正当理由的,我在MSDN上找不到关于Text属性如何评估它的解释。我甚至不确定<%$实际上做了什么。

1 个答案:

答案 0 :(得分:1)

发生的事情是ASP.net正在调用Expression Builder。这里有效发生的是,而不是ASP.net编译器翻译您的:

<asp:AControlWithATextProperty runat="server" Text="Some Text">

为:

AControlWithATextProperty ctl1 = new AControlWithATextProperty();
ctl1.Text = "Some Text";

当它将.aspx文件中的标记转换为与代码隐藏相结合的.cs文件时,它实际上会执行与此类似的操作:

<asp:AControlWithATextProperty runat="server" Text="<%$ Resources:ResourceFile, ResourceName %>">

变为:

AControlWithATextProperty ctl1 = new AControlWithATextProperty();
ctl1.Text = ResourceExpressionBuilder.EvaluateExpression("ResourceFile, Resourcename");

似乎asp.net编译器无法处理<%$ %>标记的内容与标记中属性中的任何其他文本的连接。无论是错误,还是设计。即,你最终不会得到ctl1.Text = ResourceExpressionBuilder.EvaluateExpression("ResourceFile, Resourcename") + "&raquo;"

您可以在msdn上详细了解ResourceExpressionBuilderExpressionBuilder,或者您真的想要了解更多信息。本地化的实现(数据库支持,因此我没有使用ResourceExpressionBuilder)on my blog(3部分)。