4

我正在尝试为我的 ASP.NET 代码创建本地化,但在设置 TemplateField 的 HeaderText 时遇到问题

我有这个有效

                        <asp:TemplateField HeaderText="Description">
                        <ItemTemplate>
                            <%# Eval("Description") %>
                        </ItemTemplate>
                        <FooterTemplate>
                            <asp:Panel ID="Panel5" runat="server" DefaultButton="EditSubmission">
                                <asp:TextBox runat="server" ID="Submission_DescriptionTxtBox" TextMode="MultiLine"
                                ToolTip='<%# GetById("atforbedringsforslag_description_tooltip") %>'/>

                                </asp:Panel>
                        </FooterTemplate>
                    </asp:TemplateField>

但我想改变

<asp:TemplateField HeaderText="Description">

<asp:TemplateField HeaderText='<%# GetById("atforbedringsforslag_description_title") %>'>

但后来我得到

只有具有 DataBinding 事件的对象才支持数据绑定表达式。System.Web.UI.WebControls.TemplateField 没有 DataBinding 事件。

我应该如何设置这个字段?我可以找到一些使用 OnRowCreated 的,但是您使用索引号访问字段,然后如果稍后添加新字段,则很容易出错或忘记更改索引


编辑我的解决方案:

创建了自定义表达式构建器

using System.Web.Compilation;
using System;
using System.CodeDom;

public class LocalizationExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(System.Web.UI.BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
    {
        CodeExpression[] inputParams = new CodeExpression[] { new CodePrimitiveExpression(entry.Expression.Trim()), 
                                                    new CodeTypeOfExpression(entry.DeclaringType), 
                                                    new CodePrimitiveExpression(entry.PropertyInfo.Name) };

        // Return a CodeMethodInvokeExpression that will invoke the GetRequestedValue method using the specified input parameters 
        return new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(this.GetType()),
                                    "GetRequestedValue",
                                    inputParams);
    }

    public static object GetRequestedValue(string key, Type targetType, string propertyName)
    {
        // If we reach here, no type mismatch - return the value 
        return GetByText(key);
    }

    //Place holder until database is build
    public static string GetByText(string text)
    {
        return text;
    }
}

将前缀添加到我的 web.config

<system.web>
<compilation debug="true" defaultLanguage="c#" targetFramework="4.0">
  <expressionBuilders>
    <add expressionPrefix="localizeByText" type ="LocalizationExpressionBuilder"/>
  </expressionBuilders>
    </compilation>
</system.web>

我现在可以像这样得到我的文字

<asp:TemplateField HeaderText='<%$ localizeByText:Some text %>'>
4

1 回答 1

5

您可以构建自己的自定义Expression Builder来调用您的GetById方法。查看以下链接,了解如何构建表达式构建器以及如何使用它的旧但很好的文章:

http://www.4guysfromrolla.com/articles/022509-1.aspx

当您有一个表达式生成器时,您可以将它与<%$语法一起使用。这与数据绑定语法不同<%#

对于 HeaderText 字段,不允许使用 DataBinding 语法(不知道为什么,但这就是 MS 的做法)。允许使用表达式语法,并且在您完成自定义表达式构建器后将起作用。

一定要浏览我链接的页面,它有很多文字,但最终让你表达构建器不会花费太多精力......

此外,该页面底部有一个链接,指向作者制作的表达式构建器库。看看它们,也许其中一个可以直接用于解决您的问题(特别是CodeExpressionBuilder)。

于 2012-07-09T11:36:39.750 回答