首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于将项目转换和注入到占位符的自定义ExpressionBuilder仅评估一次

用于将项目转换和注入到占位符的自定义ExpressionBuilder仅评估一次
EN

Stack Overflow用户
提问于 2017-05-04 23:12:34
回答 1查看 113关注 0票数 0

我正在尝试编写自定义表达式来将翻译注入到web中,但我在运行时计算时遇到了问题,因为它只在页面开始后计算一次,而不是在刷新或语言更改时进行计算。我的代码:

代码语言:javascript
复制
<h2 style="margin-top:0px"><asp:Literal ID="Literal15" runat="server" Text="<%$ Translate:ChooseADataset %>"></asp:Literal></h2>

代码语言:javascript
复制
using System;
    using System.CodeDom;
    using System.Globalization;
    using System.Linq;
    using System.Text.RegularExpressions;
    using System.Web;
    using System.Web.Compilation;
    using System.Web.UI;

    [ExpressionPrefix("Translate")]
    [AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    public class TranslationExpressionBuilder : ExpressionBuilder
    {
        public override bool SupportsEvaluate
        {
            get
            {
                return true;
            }
        }

        public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
        {
           return new CodePrimitiveExpression((string)parsedData);
        }

        public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
        {
            return TranslateAndFill((string)parsedData);
        } 
        public override object ParseExpression(string expression, Type propertyType, ExpressionBuilderContext context)
        {
            bool parsed = false;
            string typeName = null;
            string memberName = null;
            if (!String.IsNullOrEmpty(expression))
            {
                var parts = expression.Split(',').ToList();

                if (parts.Count == 1)
                {
                    memberName = parts[0].Trim();
                }
                else if (parts.Count == 2)
                {
                    typeName = parts[0].Trim();
                    memberName = parts[1].Trim();
                }

                parsed = true;
            }

            if (!parsed)
            {
                throw new HttpException("Invalid Reflect" + $" expression - '{expression}'.");
            }

            return TranslateAndFill(memberName);
        }

        private string TranslateAndFill(string name)
        {
            CultureInfo sCulture = WebHelpers.GetCurrentCultureInfo();

            var manager = new System.Resources.ResourceManager("Resources.String",
                global::System.Reflection.Assembly.Load("App_GlobalResources"));
            Regex regexp = new Regex("(?:\\[_)(?:.*)(?:_\\])", RegexOptions.Singleline);
            var text = manager.GetString(name, sCulture);
            var result = text;

            var shortCircuit = false;
            if (!string.IsNullOrEmpty(text))
            {
                var matches = regexp.Matches(text);
                while (matches.Count != 0 && shortCircuit == false)
                {
                    foreach (var match in matches)
                    {
                        var key = match.ToString().Replace("[_", "").Replace("_]", "");
                        var replacement = manager.GetString(key, sCulture) ?? match.ToString();
                        result = result.Replace(match.ToString(), replacement);
                        if (!replacement.Contains("[_"))
                        {
                            matches = regexp.Matches(result);
                        }
                        else
                        {
                            shortCircuit = true;
                            break;
                        }

                    }
                }
            }
            return result;
        }
    }  
EN

回答 1

Stack Overflow用户

发布于 2017-05-05 16:39:08

我已经找到了解决方案。我只是为了使用CodeMethodInvokeExpression而更改了GetCodeExpression

代码语言:javascript
复制
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
        {
            var type = entry.DeclaringType;
            if (entry.DeclaringType != null)
            {
                return new CodeCastExpression(typeof(string), new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(base.GetType()), "TranslateAndFill",
                    new CodePrimitiveExpression(entry.Expression.Trim())));
            }
            return new CodePrimitiveExpression((string)parsedData);

        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43786760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档