代码之家  ›  专栏  ›  技术社区  ›  emkayultra

PageRequestManagerParserErrorException-带有自定义页面的UpdatePanel。提供

  •  0
  • emkayultra  · 技术社区  · 7 年前

    我有一个要求,能够有动态的客户特定的文本替换在每一页上。例如,我可以把{CarMake}放在一个页面的任何地方,它会将我们的福特客户的{CarMake}更改为“Ford”,将丰田更改为“Toyota”,等等。我们使用一个自定义页面来实现这一点。Render函数,它将在输出到客户端之前对呈现的html进行替换。

    自定义页面。渲染本质上与响应过滤器的想法相同,我已经阅读了 Eilon Lipton's fantastic explanation of this error

    这个ASPX页面标记在UpdatePanel中包含:

    <p>{CarMake}</p>
    

    则加载页面的呈现HTML包含:

    <p>Ford</p>
    

    然后,当UpdatePanel进行部分回发时,我得到了UpdatePanel响应的上述解析错误,它似乎包含正确替换的文本(就像HTML的初始呈现):

    "1|#||4|2325|updatePanel|UpdatePanelCars|...<p>Ford</p>..."
    

    那么,如果呈现的HTML完全相同,为什么会出现问题?客户端解析是如何检测到差异的?

    作为参考,进行替换的代码如下:

    class TemplatedPage: System.Web.UI.Page
    {
       ...
       protected override void Render(HtmlTextWriter writer)
       {
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
    
            HtmlTextWriter hWriter = new HtmlTextWriter(sw);
            base.Render(hWriter); //obtain full html markup, still containing {} at this point
    
            sb.Replace("{CarMake}", "Ford");
            //other Replacements...
    
            string alteredPageContents = sb.ToString();
    
            writer.Write(alteredPageContents);
       }
    }
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   Alex Kudryashev    7 年前

    我想你的替换模板 {something} <asp:Literal runat="server">{something}</asp:Literal> . aspx页面在其生命周期中会经历许多阶段 render 非常接近尾声。运行前 提供 页面保存 ViewState 它保留所有控件的状态(内容),服务器控件内容中的任何更改都会导致 post ed请求并保存 对象
    您可以修改页面内容的最新时刻是 page_PreRenderComplete 事件处理程序。
    邮递 ed回来了(全部或部分),那没关系。
    事实上,我在许多(所有)页面中使用了非常相似的代码,但我只对控件渲染进行了重新排序(将 script 到底部等等)。内部更换件 提供 导致错误,我在内部使用了一些解决方法 Page_PreRenderComplete

    更新以回答评论

    在里面 页面预渲染完成

    void Page_PreRenderComplete(object sender,EventArgs e)
    {
        ProcessPageTree((Control)sender); //sender is Page which inherit from Control
    }
    void ProcessPageTree(Control control) //All server side controls inherit from abstract Control
    {
        if(control is HyperLink)
        {
            var hl = control as HyperLink;
            hl.Text = hl.Text.Replace("{{something}}", "something new");
        }
        else if(control is Literal)
        {
            var ltr = control as Literal;
            ltr.Text = ltr.Text.Replace("{{some}}", "something another");
        }
        if (control.HasControls())
        {
            foreach(Control c in control.Controls)
            {
                ProcessPageTree(c);
            }
        }
    }
    
    推荐文章