我有一个aspx页面,其中包含常规html,一些uicomponents和{tokenname}形式的多个标记。
当页面加载时,我想解析页面内容并用正确的内容替换这些标记。我们的想法是会有多个模板页面使用相同的代码隐藏。
我解析字符串数据本身并没有问题,(请参阅named string formatting,replace tokens in template)我的麻烦在于什么时候阅读,以及如何将数据写回页面... < / p>
重写页面内容的最佳方法是什么?我一直在使用streamreader,并用Response.Write替换页面,但这不好 - 包含其他.net组件的页面无法正确呈现。
任何建议都将不胜感激!
答案 0 :(得分:1)
查看System.Web.UI.Adapters.PageAdapter方法TransformText - 通常它用于多设备支持,但您可以使用此方法对页面进行后处理。
答案 1 :(得分:1)
我不确定我是否在回答你的问题,但...... 如果你可以改变你的记谱法
{tokenname}
类似
<%$ ZeusExpression:tokenname %>
您可以考虑创建System.Web.Compilation.ExpressionBuilder。
阅读评论后......
还有其他方法可以使用ExpressionBuilder访问当前页面:只需...创建一个表达式。 ;-) 只更改MSDN中的样本并假设您的页面代码包含这样的方法
public object GetData(string token);
你可以实现类似这样的东西
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
Type type1 = entry.DeclaringType;
PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(type1)[entry.PropertyInfo.Name];
CodeExpression[] expressionArray1 = new CodeExpression[1];
expressionArray1[0] = new CodePrimitiveExpression(entry.Expression.Trim());
return new CodeCastExpression(
descriptor1.PropertyType,
new CodeMethodInvokeExpression(
new CodeThisReferenceExpression(),
"GetData",
expressionArray1));
}
这会用这样的调用替换你的占位符
(string)this.GetData("tokenname");
当然,您可以详细说明这一点,可能使用“实用工具方法”来简化和“保护”对数据的访问(访问属性,不涉及特殊方法,错误处理等)。
取而代之的是(例如)
(string)Utilities.GetData(this, "tokenname");
希望这有帮助。
答案 2 :(得分:0)
非常感谢那些促成这个问题的人,但我最终使用了不同的解决方案 -
按照this page覆盖渲染函数,但我使用正则表达式解析了多个不同标记的页面内容。
protected override void Render(HtmlTextWriter writer)
{
if (!Page.IsPostBack)
{
using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
{
using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(stream))
{
HtmlTextWriter htmlWriter = new HtmlTextWriter(streamWriter);
base.Render(htmlWriter);
htmlWriter.Flush();
stream.Position = 0;
using (System.IO.StreamReader oReader = new System.IO.StreamReader(stream))
{
string pageContent = oReader.ReadToEnd();
pageContent = ParseTagsFromPage(pageContent);
writer.Write(pageContent);
oReader.Close();
}
}
}
}
else
{
base.Render(writer);
}
}
这是正则表达式标记解析器
private string ParseTagsFromPage(string pageContent)
{
string regexPattern = "{zeus:(.*?)}"; //matches {zeus:anytagname}
string tagName = "";
string fieldName = "";
string replacement = "";
MatchCollection tagMatches = Regex.Matches(pageContent, regexPattern);
foreach (Match match in tagMatches)
{
tagName = match.ToString();
fieldName = tagName.Replace("{zeus:", "").Replace("}", "");
//get data based on my found field name, using some other function call
replacement = GetFieldValue(fieldName);
pageContent = pageContent.Replace(tagName, replacement);
}
return pageContent;
}
似乎工作得很好,因为在GetFieldValue函数中,您可以以任何方式使用您的字段名称。