2011-03-01 48 views
1

背景ASP.NET NamingContainer命名約定

您好!我正在開發一個項目,在這個項目中,客戶需要在單個頁面上發生很多事情,這導致了相當大量的HTML被呈現給客戶端瀏覽器。

主要問題是輸入標籤(其中runat =「server」屬性被設置),由於驗證,updatepanel觸發器,viewstate和控件標記本身,這些往往會導致標記大小急劇增加。我已經盡我所能來減少我使用的觸發器的數量,我正在壓縮視圖狀態(類似於原始視圖狀態大小的8%),我已經擺脫了許多ASP.NET驗證器並推出自己的,並且我一直在使用ClientIdMode來減少許多asp.net元素的ID屬性的長度。所有這些都大大減少了發送給客戶端的HTML數量(例如,從2兆字節的請求下降到500-600千字節 - 這些是巨大的頁面,請注意)。

的問題,我一直有麻煩減少

的一個領域是簡單地自動生成「名稱」屬性的輸入元素的

<input name="ctl00$ctl00$ctl00$_main$_main$_bodyMatterPhase$_phaseTree$ctl00$_taskTree$ctl00$_taskDetails$_detailList$ctrl0$_row$_descriptionText" type="text" value="Investigation Week 1" maxlength="100" id="_taskTree_0__taskDetails_0__detailList_0__row_0__descriptionText_0" style="width:170px;"> 

正如你可以在上面看到,name屬性是出297個字符,這是由巨大的名義採取了標籤標記的幾乎50%

有沒有人對如何堅持在ASP.NET的地方在那裏我能以某種方式把這些或不同生成它們的鉤子任何想法;說,而不是ctl00 $ ctl00 $ ctl00 $ _main $ _main $ _bodyMatterPhase $ _phaseTree $ ctl00 $ _taskTree $ ctl00 $ _taskDetails $ _detailList $ ctrl0 $ _row $ _descriptionText,它可能是一個GUID,如0x0AEED4B6445A11E08F873606E0D72085,這是短105個字符。

任何幫助將不勝感激!

+0

這是.NET 4或.NET3.5? – jcolebrand 2011-03-01 23:24:53

+0

嗨 - 對不起,它是.NET 4.0 – eoleary 2011-03-02 14:42:44

回答

0

這是不可能在asp.net版本早於4.0。
在4.0你有ClientIDMode屬性河畔,你可以將其設置爲「靜態」值來獲得較短的名稱。
在那裏尋找更多的信息:http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientid.aspx

+0

它改變ID而不是名稱。 – Meligy 2011-03-01 23:28:42

+0

嗨,我正在使用.NET 4.0,並已經使用ClientIDMode,這很好用;然而,這隻會影響渲染元素的「id」屬性,而不會影響輸入元素的「name」屬性。 – eoleary 2011-03-02 14:38:04

0

好吧,讓你兩個答案你的問題。您的項目按照它們的方式命名的原因是實現了INamingContainer,其中每個容器在子控件的名稱前加上一個唯一標識符。因此,你的id的結構和長度是由你的HTML結構控制的。

現在,在.NET 4.0中,你必須控制,以便能夠多一點控制這個你自己。我建議看看article,瞭解更多信息。

+0

是的,那篇文章解決了我已經非常熟悉的ClientIDMode。我在網站的某些部分廣泛使用了命名容器,所以我意識到它們的功能(不是我完全確定它們是如何工作的),但似乎可以使用過程函數來生成較短的唯一ID爲每個控件,仍然能夠追溯並找到相應的服務器端控件..理論上;) – eoleary 2011-03-02 14:41:45

+0

更改INamingContainer行爲的唯一擴展點是使用ClientIdMode。如果您認爲自己有更好的想法,我會建議將其登錄到Connect中,以便Microsoft可以考慮它。 – 2011-03-02 16:49:09