2014-09-29 35 views
0

使用CMS,發佈站點地圖頁面時,會生成站點地圖頁面上的站點地圖部分的HTML。因此,在本質上,sitemap.aspx頁面坐在靜態HTML我們的網絡服務器上:在aspx頁面中存儲大量序列化數據以在代碼隱藏中讀取的最佳實踐?

Sitemap.aspx:

<ul> 
    <li><a href="/">Home Page</a> 
    <li><a href="/etc.aspx">etc</a> 
</ul> 

這是偉大的,所有的,但我們參與了分離討伐的擔憂和廢除服務器端預生成的HTML。因此,CMS現在生成了在aspx頁面上構建網站地圖部分所需的JSON數據。所以頁面是現在這樣的嵌入數據源動態:

[ { Title: "Home Page", Url: "/" }, { Title: "etc", Url: "/etc.aspx" } ] 

<ul> 
    <% foreach(var page in Pages) { %> 
    <li><a href="<%: page.Url %>"><%: page.Title %></a></il> 
    <% } %> 
</ul> 

這裏的挑戰是讓阿霍德數據將其反序列化到一個強類型的對象。

我已經探討:

  1. 插入數據作爲頁面的字段,以便它可以在後面的代碼讀取:

<%@頁面語言=」 C#「AutoEventWireup =」true「 nherits =」SiteMapPage「Data =」@@ SiteTreeData @@「 %>

這使得給:

<%@頁面語言= 「C#」 AutoEventWireup = 「真」 nherits = 「SiteMapPage」 數據= % 「{大JSON數據的量}」 >


  • 或者也創建自定義用戶控制來包裝其中它可以在後面的代碼被讀取的JSON:
  • <答:JsonTransport RUNAT = 「服務器」 ID = 「SiteTreeData」> @@ SiteTreeData @@ </A:JsonTransport >

    這使得給:

    < A:JsonTransport runat =「server」ID =「SiteTreeData」> {大量的json數據} </A:JsonTransport >

    所以,我可以在後面的代碼抓住它:

    this.Data= container.Controls.OfType<LiteralControl>().FirstOrDefault().Text; 
    

    在任何情況下,我在加載頁面時碰到一個例外:

    系統。 Web.HttpCompileException(0x80004005):(0):錯誤CS1647:一個 表達式太長或編譯複雜

    我相信這是因爲呈現的json字符串可能非常大;在1mb以上。

    所以,我的問題是,什麼是在aspx頁面中存儲大型呈現的序列化數據的最佳實踐/方法/指導,以便可以在後面的代碼中讀取和反序列化以實現最佳性能?

    回答

    0

    ASPX並不意味着要這樣使用。

    最好的我可以弄清楚 - 使用您的CMS生成的XML文件,在代碼隱藏中加載它,根據需要緩存並使用它來爲您的動態頁面提供服務。

    var xml = @"<ul> 
        <li><a href=""/"">Home Page</a></li> 
        <li><a href=""/etc.aspx"">etc</a></li> 
    </ul>"; 
    
    var document = XElement.Parse(xml); // You could use XElement.Load(Server.MapPath("~/App_Data/fileName.xml")) as well 
    
    this.Pages = document 
        .Elements("li") 
        .Select(li=>li.Element("a")) 
        .Select(el=>new Page{Url = el.Attribute("href").Value, Title = el.Value}).ToList(); 
    
    相關問題