Переопределение рендера на странице Sharepoint - PullRequest
1 голос
/ 29 октября 2009

Я переопределил метод Render на странице Sharepoint, чтобы вырезать какой-либо тег скрипта из 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);
    }

После этого изменения произошло нечто странное: часть страницы, которая обычно находится в верхнем правом углу и говорит "Welcome XXX", не отображается должным образом. Когда я просматриваю источник страницы, этот текст пишется ДО HTML-тега - до начала любого HTML. Я не могу понять, что происходит в последние два дня.
У вас есть идеи, у кого-нибудь была похожая проблема?

Ответы [ 4 ]

2 голосов
/ 29 октября 2009

Вам может повезти, если вы используете пакет гибкости HTML. Синтаксические анализаторы HTML лучше ... разбирают ... HTML, чем регулярные выражения.

http://www.codeplex.com/htmlagilitypack

2 голосов
/ 29 октября 2009

Вы проверили свой Regex? Regex жадные. Это означает, что по умолчанию возвращается самое длинное совпадение.

Так что, если ваш HTML выглядит примерно так:

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

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

Regex сопоставляет все элементы между началом первого элемента сценария и концом второго элемента сценария. После замены ваш вывод должен быть:

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

Вы можете превратить свое регулярное выражение в неуклюжего или ленивого (найдите наименьшее возможное соответствие) Добавить ? после * и это должно сделать:

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

Это может решить проблему. Смотрите здесь для получения дополнительной информации.

0 голосов
/ 09 сентября 2014

На самом деле это проблема 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. Я только что заполнил эту часть страницы, используя RegEx после факта.

0 голосов
/ 31 июля 2014

HTMLAgilityPack полон ошибок, не используйте его! Если вам нужно простое решение, вы можете написать свой собственный метод. В противном случае вам будет гораздо лучше использовать https://github.com/google/gumbo-parser,, у него есть .Net-оболочка с именем gumbo.bindings

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...