在加载时替换aspx页面中的标记

时间:2009-08-12 10:03:19

标签: c# asp.net .net-2.0 c#-2.0

我有一个aspx页面,其中包含常规html,一些uicomponents和{tokenname}形式的多个标记。

当页面加载时,我想解析页面内容并用正确的内容替换这些标记。我们的想法是会有多个模板页面使用相同的代码隐藏。

我解析字符串数据本身并没有问题,(请参阅named string formattingreplace tokens in template)我的麻烦在于什么时候阅读,以及如何将数据写回页面... < / p>

重写页面内容的最佳方法是什么?我一直在使用streamreader,并用Response.Write替换页面,但这不好 - 包含其他.net组件的页面无法正确呈现。

任何建议都将不胜感激!

3 个答案:

答案 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函数中,您可以以任何方式使用您的字段名称。