Как программно отрендерить DataFormWebPart?

У меня есть сайт для публикации с MOSS 2007, и мне нужно программно получать содержимое страницы. Я знаю, что могу использовать WebClient для отправки запроса на страницу, а затем проанализировать текст ответа. Но я хочу сделать это в модели SharePoint, так как масштаб очень большой.

Веб-части, которые я хочу отобразить, - это DataFormWebPart, и они хорошо отображаются при просмотре в браузере. Но я получаю исключения, когда пытаюсь их визуализировать программно.

Код:

var partMgr = siteCollection.RootWeb.GetLimitedWebPartManager(pageUrl, PersonalizationScope.Shared);

var sr = new StreamWriter(@"d:\temp\test.txt", false);
var htr = new HtmlTextWriter(sr);

foreach (WebPart part in partMgr.WebParts)
{
    if (part.GetType() == new DataFormWebPart().GetType())
    {
        try
        {
            htr.WriteLine("");
            part.RenderBeginTag(htr);
            htr.WriteLine("");
            part.RenderControl(htr);
            htr.WriteLine("");
            part.RenderEndTag(htr);
            htr.WriteLine("");
        }
        catch (Exception exc)
        {
            htr.WriteLine("Message: " + exc.Message);
            htr.WriteLine("StackTrace: " + exc.StackTrace);
            htr.WriteLine("InnerException: " + (exc.InnerException == null).ToString());
        }
    }
}
sr.Close();
htr.Close();

Выход:

<div id="g_1722aa69_d0d7_4804_83fa_c8f4a250080a">
    Message: Value cannot be null. Parameter name: page
    StackTrace:    at System.Web.UI.WebControls.WebParts.WebPartManager.GetCurrentWebPartManager(Page page)
   at Microsoft.SharePoint.WebPartPages.WebPart.Render(HtmlTextWriter writer)
   at ExtractPageData.Program.Main(String[] args) in D:\DNR-Playground\ExtractPageData\ExtractPageData\Program.cs:line 49
    InnerException: False

    <div id="g_1115045e_b0d7_41ce_ad19_15aab0f3871d">
        Message: Value cannot be null. Parameter name: page
        StackTrace:    at System.Web.UI.WebControls.WebParts.WebPartManager.GetCurrentWebPartManager(Page page)
   at Microsoft.SharePoint.WebPartPages.WebPart.Render(HtmlTextWriter writer)
   at ExtractPageData.Program.Main(String[] args) in D:\DNR-Playground\ExtractPageData\ExtractPageData\Program.cs:line 49
        InnerException: False

Как вы можете видеть в выводе, тег начала отображается, но элемент управления не может быть отображен из-за part.Page является null и это атрибут только для чтения.

1 ответ

Решение

Это просто не сработает. Веб-части требуют надлежащего SPContext который настраивается во время обработки HTTP-запроса в конвейере ASP.NET. Нет простого ответа, как это преодолеть. По сути, вам нужно будет смоделировать HTTP-запрос к странице, которую вам нужно отобразить в памяти.


Также это выражение part.GetType() == new DataFormWebPart().GetType() далеко от идеала. Скорее использовать part.GetType() == typeof(DataFormWebPart) для предотвращения возникновения и возможных нежелательных побочных эффектов.

Другие вопросы по тегам