我正在尝试编写自定义表达式来将翻译注入到web中,但我在运行时计算时遇到了问题,因为它只在页面开始后计算一次,而不是在刷新或语言更改时进行计算。我的代码:
<h2 style="margin-top:0px"><asp:Literal ID="Literal15" runat="server" Text="<%$ Translate:ChooseADataset %>"></asp:Literal></h2>
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;
}
} 发布于 2017-05-05 16:39:08
我已经找到了解决方案。我只是为了使用CodeMethodInvokeExpression而更改了GetCodeExpression
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);
}https://stackoverflow.com/questions/43786760
复制相似问题