【问题标题】:Overriding Render on Sharepoint page在 Sharepoint 页面上覆盖渲染
【发布时间】:2014-09-09 05:02:45
【问题描述】:

我已经重写了 Sharepoint 页面的 Render 方法,以从发送到客户端浏览器的 html 中删除一些脚本标记,如下所示:

protected override void Render(HtmlTextWriter originalWriter)
    {   
        string content = string.Empty;
        using (StringWriter stringWriter = new StringWriter())
        {
            using (HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter))
            {
                //render the page to my temp writer
                base.Render(htmlWriter);
                htmlWriter.Close();
                //get page content that would normally be sent to client
                content = stringWriter.ToString();
                stringWriter.Close();
            }
        }
        //replace the script tag
        Regex regex = new Regex(@"<script>.*RTE_ConvertTextAreaToRichEdit.*<"+"/script>");
        content = regex.Replace(content, string.Empty);

        //write modified html to the original writer
        originalWriter.Write(content);
    }

在此更改之后发生了一些奇怪的事情:通常位于右上角并显示“欢迎 XXX”的页面部分未正确显示。当我查看页面的源代码时,此文本在 HTML 标记之前写入 - 在任何 html 开始之前。我不知道过去两天发生了什么。
你有什么想法吗,有没有人遇到过类似的问题?

【问题讨论】:

    标签: asp.net sharepoint


    【解决方案1】:

    您检查过您的正则表达式吗?正则表达式是贪婪的。这意味着默认情况下它会返回可能的最长匹配项。

    如果你的 HTML 看起来像这样:

    <html>
       ...
       <!-- first script element -->
       <script>...RTE_ConvertTextAreaToRichEdit...</script>
       <!-- first script element ends -->
    
       <!-- second script element -->
       <script>...</script>
       <!-- second script element ends -->
       ...
    </html>
    

    正则表达式匹配第一个脚本元素的开头和第二个脚本元素的结尾之间的所有内容。替换后你的输出应该是:

    <html>
       ...
       <!-- first script element -->
       <!-- second script element ends -->
       ...
    </html>
    

    您可以将您的正则表达式转换为不贪婪或懒惰的正则表达式(找到可能的最小匹配)。添加一个?在 * 之后应该这样做:

    Regex regex = new Regex(@"<script>.*?RTE_ConvertTextAreaToRichEdit.*?</script>");
    

    这可能会解决问题。查看here了解更多信息。

    【讨论】:

    • 嗯,这可能是它,我不这么认为,但无论如何这是一个很好的猜测。我去看看
    • 哦,是的,我忘记了即使我不替换任何东西(根本不使用正则表达式)问题仍然存在 - 只需将页面呈现给我的临时编写器并将其内容重写到原作者。这真的很奇怪。所以这可能不是你提到的
    • 您是否检查过渲染方法输出的预期 HTML 片段在哪里结束?是在正确的地方吗?
    【解决方案2】:

    您可能会在使用 HTML 敏捷包时获得一些运气。 HTML 解析器比正则表达式更擅长...解析... html。

    http://www.codeplex.com/htmlagilitypack

    【讨论】:

      【解决方案3】:

      HTMLAgilityPack 充满了错误,不要使用它!如果您需要简单的解决方案,您可以编写自己的方法。否则你最好使用https://github.com/google/gumbo-parser,它有一个名为gumbo.bindings的.Net包装器

      【讨论】:

        【解决方案4】:

        这实际上是一个 sharePoint 问题......也发生在 2010 年和 2013 年。

        如果你按照你在示例中的方式操作渲染,它会被 gank。

        您不能直接回信给作者。使用:

        StrinBuilder sb = new StringBuilder();
        StringWriter str = new StringWriter(sb);
        HtmlTextWriter wrt = new HtmlTextWriter(str);
        base.Render(wrt);
        wrt.close();
        string html = sb.ToString();
        html = SomeFunctionManipulatingYourHTML(html).Trim();
        if (html.Length >0)
        {
            Response.Buffer = true;
            Response.Clear();
            Response.ContentType = "text/html";
            Response.Write(html);
            Response.Flush();
            Response.End();
        }
        

        为我工作...您仍然需要填充右上角的“欢迎消息”,因为它是在渲染之后填充的,但至少您现在可以操作它并拥有干净的 HTML。我只是在事后使用 RegEx 填充了页面的那一部分。

        【讨论】:

          猜你喜欢
          • 2018-05-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-15
          • 2017-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-11
          相关资源
          最近更新 更多