2010-03-11 38 views
5

嗚,我有一個問題的一個謊言(甚至可能是一個用於日常WTF),我希望有一個解決方案。 (我道歉了很長的帖子...)替代的Page_Load在ASP.NET(和良好的WTF故事)

我一直在努力,我繼承了大約一個月前在網站上。我一直在研究的部分之一是修復其中一個控件(實質上是一個動態標題欄),以便它顯示我的用戶請求的其他信息。作爲這個項目的一部分,我創建了一個Site.master文件,這樣我就不必將標題欄重新編碼到每個頁面中。當我第一次開始這樣做時,它表現得非常好。我開發的所有網頁看起來都很棒,並且更新了條形圖,因爲它應該顯示應該顯示的信息。

好吧,當我放棄了的Site.Master(而且這種控制)到舊的站點頁面(那些我沒有具體制定),我注意到,它看起來很糟糕對其中的一部分,但不是全部。當我說它看起來很糟糕時,基本上,控制權將自行對齊到頁面而不是中心。我花了幾個小時進行調試無濟於事--CSS看起來是正確的,HTML似乎沒問題,我沒有看到Javascript中的任何內容(儘管我錯過了一些內容,正如我會在第二段中指出的那樣),甚至舊的代碼看起來是正確的(盡最大可能 - 它寫得不是很好)。另一位同事看了看網站,一開始也找不到任何東西。

直到我只是想看看網頁的呈現的源代碼(我一直在開發工作查看最多的IE8了這一點),它變得清晰什麼是錯的。

最初的開發者很多的網頁進行搜索。爲了實現這一點,他查詢數據庫中的所有數據,然後將它們加載到頁面內的Javascript數組中,以便他可以訪問它們。這本身就是一個巨大的問題,因爲我們談論的是成千上萬的項目,顯然它不具備可擴展性(並且,是的,該網站很慢)。然而,它終於點擊了搞砸Site.master的東西 - 當他將數據加載到Javascript數組中時,他使用大量Response.Write(string)調用將數據寫到Page_Load上的HTML中。跆拳道(和什麼搞砸了我)是他在DOCTYPE之前插入Javascript導致IE進入怪癖模式!我想知道:有沒有一種方法可以強制這個Javascript被插入到HTML —之後的其他地方DOCTYPE至少?現在,所有的Response.Write()調用都在Page_Load方法中完成。我只需要他們稍後插入。

回答

5

有很多方法可以做到這一點,更有可能這樣做的「正確」方式是建立字符串,然後使用Page.ClientScript.RegisterClientScriptBlock方法註冊JS,這會將它放在正確的位置地方

另一種替代方法,更快速和骯髒的方法是將控件添加到頁面,而不是response.write,建立JS,然後設置文字控件的文本屬性。

+0

+1 - 我們發佈了*相同的第二個*,但你的答案更好:) – 2010-03-11 14:53:46

+0

謝謝,我實際上也重新措辭它,因爲技術上Page.ClientScript是「更好」和正確的方式來做到這一點...... – 2010-03-11 14:54:53

0

把生成的JavaScript代碼到屬性的母版頁上,而母版頁處理。主頁在之後呈現它封裝的頁面,但它的成員可用於其內容頁面。

1

更換的Response.Write電話很可能是使用StringBuilder的最簡單的方法:

StringBuilder sb = new StringBuilder(); 
sb.Append("your script writes here"); // instead of Response.Write 

,並使用頁面。ClientScript管理器將腳本放在可以使用的地方。有幾種方法來註冊腳本,和每個人的地方,劇本在不同的地點頁面上,根據當前的控制你在生命週期的下面是一個例子(上面已經覆蓋):

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "yourScriptKey", sb.ToString()); 
相關問題