2015-10-22 70 views
0

我希望我的客戶能夠通過選擇給定的小部件在Kentico中設計自己的頁面。所以他們創建一個頁面,選擇一個帶有小部件區域的模板,然後放置他們想要的任何小部件。Kentico:以編程方式檢索頁面的呈現內容

我想要做的是,我想開發一個小部件,檢索其中一個頁面的內容,然後處理/封裝它。或者用更多的技術詞彙,我想將頁面內容作爲HTML小部件中的HTML字符串。

不幸的是,Kentico API沒有提供檢索頁面內容的方法,或者至少我不知道如何。有一個Kentico Web部件,即「頁面佔位符」,它完全符合我的需求,但是,我無法在小部件中使用其功能。我認爲我可以在我的widget.ascx中使用cms:CMSPagePlaceholder標籤,但由於某種原因,它在那裏是不可見的(不過我可以從Kentico CMS命名空間中選擇許多不同的其他控件)。

我也嘗試通過System.Net.WebClient類接收內容 - 沒有成功。我得到的是

(401)未經授權

不過,我可以打開我的瀏覽器給定的URL。 (如果你可以告訴我爲什麼是這樣的話,獎勵積分可以告訴我爲什麼,我已經在另一個上下文中偶然發現了這個401錯誤(訪問暫存web服務)並且無法弄清楚爲什麼。在瀏覽器中登臺Web服務的URL,但不在Kentico內部...非常奇怪)

一些背景信息:我正在從我的物理文件存儲的客戶端開發,我正在訪問服務器上的共享數據庫。物理文件基本上是我的客戶端和服務器上的重複文件。我只推送我更改的Web部件文件。服務器Kentico實例與我的客戶端的Kentico實例具有不同的URL,並且我將客戶端的URL重定向到服務器(通過「站點」設置)。

長話短說,我如何爲我的小部件獲取文檔的呈現HTML?如果那是可能的,它會讓我的生活變得更容易。

回答

1

嘗試以編程方式呈現頁面內容可能非常麻煩。我會說WebClient的方法是唯一明智的方法。根據您的Kentico實例的身份驗證方法,您必須提供正確的憑據集,以免發生401錯誤。如果您使用Windows身份驗證,則需要提供帶有NetworkCredential對象的Web請求。如果您使用表單身份驗證,則可以複製cookie以便請求「模擬」當前登錄的用戶。

這是驗證System.Net.WebClient針對ASP.NET的例子窗體身份驗證:

public class CookieReplicatingWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     if (request != null) 
     { 
      HttpCookieCollection cookies = HttpContext.Current.Request.Cookies; 

      CookieContainer cookieContainer = new CookieContainer(); 

      for (int i = 0; i < cookies.Count; i++) 
      { 
       // Clone cookies 
       HttpCookie httpCookie = cookies[i]; 
       if (httpCookie != null) 
       { 
        cookieContainer.Add(new Cookie { Domain = request.RequestUri.Host, Name = httpCookie.Name, Path = httpCookie.Path, Secure = httpCookie.Secure, Value = httpCookie.Value }); 
       } 
      } 

      request.CookieContainer = cookieContainer; 
     } 
     return request; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    using (WebClient client = new CookieReplicatingWebClient()) 
    { 
     // Request secured area (of Kentico's Corporate sample site) 
     string htmlCode = client.DownloadString("http://localhost/Kentico82/Partners/Gold-partners.aspx"); 
    } 
} 
+0

謝謝你的回答!您的代碼非常有用。 – RolandK

0

在我看來,最好的方法是使用HtmlAgilityPack

通過使用此工具,您可以非常輕鬆地加載管理整個呈現的頁面。

private HtmlDocument GetDocument(string url) 
{ 
    HtmlWeb page = new HtmlWeb(); 

    return page.Load(url); 
} 

這將返回一個代表html不同部分的對象。 舉例來說,如果你想獲得頁面的標題,然後你做:

string header = document.DocumentNode.SelectSingleNode("//header").OuterHtml; 

希望它能幫助!

相關問題