覆盖Sharepoint页面上的Render

时间:2009-10-29 11:19:59

标签: asp.net sharepoint

我已经覆盖了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启动之前。我无法弄清楚过去两天的情况 你有任何想法,有没有人有类似的问题?

4 个答案:

答案 0 :(得分:2)

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

因此,如果您的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了解更多信息。

答案 1 :(得分:2)

使用HTML敏捷包可能会有些运气。 HTML解析器更好...解析... html而不是正则表达式。

http://www.codeplex.com/htmlagilitypack

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这实际上是一个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();
}

为我工作......你仍然需要填充右上角&#34;欢迎辞&#34;因为它在渲染之后填充,但至少你现在可以操纵它并拥有干净的HTML。我刚刚在事后用RegEx填充了页面的那一部分。