Asp.net 覆盖Sharepoint页面上的呈现

Asp.net 覆盖Sharepoint页面上的呈现,asp.net,sharepoint,Asp.net,Sharepoint,我已重写Sharepoint page的Render方法,从发送到客户端浏览器的html中剪切一些脚本标记,如下所示: protected override void Render(HtmlTextWriter originalWriter) { string content = string.Empty; using (StringWriter stringWriter = new StringWriter()) {

我已重写Sharepoint page的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);
    }
protected override void Render(HtmlTextWriter originalWriter)
{   
string content=string.Empty;
使用(StringWriter StringWriter=new StringWriter())
{
使用(HtmlTextWriter htmlWriter=新的HtmlTextWriter(stringWriter))
{
//将页面呈现给我的临时编写器
base.Render(htmlWriter);
htmlWriter.Close();
//获取通常会发送到客户端的页面内容
content=stringWriter.ToString();
stringWriter.Close();
}
}
//替换脚本标记
Regex Regex=new Regex(@“*RTE_convertextAreatorchedit.*);
content=regex.Replace(content,string.Empty);
//将修改后的html写入原始编写器
原创作者。写作(内容);
}
在这一更改之后,发生了一些奇怪的事情:页面的一部分通常位于右上角,上面写着“欢迎XXX”,但没有正确显示。当我查看页面的源代码时,这个文本是在HTML标记之前写入的——在任何HTML开始之前。我搞不清楚最近两天发生了什么事。

你有什么想法吗?有没有人有类似的问题?

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

因此,如果您的HTML看起来像这样:

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

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

...
…RTE_转换器文本区域编辑。。。
...
...
正则表达式匹配第一个脚本元素开始和第二个脚本元素结束之间的所有内容。更换后,您的输出应为:

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

...
...
你可以把你的正则表达式变成一个不规则的或懒惰的(找到最小的匹配项)。添加一个?在*之后,应该这样做:

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

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

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

因此,如果您的HTML看起来像这样:

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

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

...
…RTE_转换器文本区域编辑。。。
...
...
正则表达式匹配第一个脚本元素开始和第二个脚本元素结束之间的所有内容。更换后,您的输出应为:

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

...
...
你可以把你的正则表达式变成一个不规则的或懒惰的(找到最小的匹配项)。添加一个?在*之后,应该这样做:

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

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

使用HTML敏捷包可能会有一些运气。HTML解析器更擅长于。。。解析。。。html比正则表达式更有用


使用HTML敏捷包可能会有一些运气。HTML解析器更擅长于。。。解析。。。html比正则表达式更有用


HTMLAgilityPack充满了bug,不要使用它!如果您需要简单的解决方案,您可以编写自己的方法。否则你会更好地使用它,它有一个名为

HTMLAgilityPack的.Net包装,里面充满了bug,不要使用它!如果您需要简单的解决方案,您可以编写自己的方法。否则,您将更好地使用它,它有一个名为

的.Net包装,这实际上是sharePoint的问题。。。2010年和2013年也是如此

如果按照示例中的方式操作渲染,它将变为呆滞

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

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。我只是在事后使用正则表达式填充了页面的这一部分。

这实际上是一个sharePoint问题。。。2010年和2013年也是如此

如果按照示例中的方式操作渲染,它将变为呆滞

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

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。我只是在事后使用正则表达式填充了页面的这一部分。

可能就是这样,我不这么认为,但无论如何,这是一个很好的猜测。我会检查它是的,我忘记了问题仍然存在,即使我不更换任何东西(根本不使用正则表达式)-只需将页面呈现给我的临时编写器,并将其内容重写为原始编写器。这真的很奇怪。因此,这可能不是您所提到的。您是否检查了render方法输出的预期HTML片段的最终位置?是在正确的地方吗?嗯,也许是这样,我不这么认为,但无论如何,这是一个很好的猜测。我会检查它是的,我忘记了问题仍然存在,即使我不更换任何东西(根本不使用正则表达式)-只需将页面呈现给我的临时编写器,并将其内容重写为原始编写器。这真的很奇怪。因此,这可能不是您所提到的。您是否检查了render方法输出的预期HTML片段的最终位置?在正确的地方吗?