2010-07-06 75 views
1

我目前工作的一個ASP.NET 3.5的項目,我想知道您對以下情況的意見,我正好碰上有時:上動態或不創建控件

比方說我」已經在我的代碼某處定義的組件框架的以下控制:

<Window runat="server" ID="windowTest" /> 

我們假設與上面提到的組件框架,它可以從客戶機獲得一個參考我的Window控制SID e。使用其ID(例如以改變其外觀):

function MyFunc(){ 
    var win = GetWindow("windowTest"); 
} 

讓我們還假設兩個代碼段被放置在不同的文件,例如MasterPage.Master中的JavaScript代碼和AnotherPage.aspx中的控件。

正如你可能已經注意到了,控制的ID作爲一個硬編碼字符串到GetWindow功能的傳球有點問題在這裏,因爲改變控制的ID是要打破JavaScript函數。

這種情況肯定聞起來像它需要一個很好的ol'Replace Magic Number with Symbolic Constant重構。

AnotherPage.aspx

Window windowTest = new Window(); 
windowTest.ID = Consts.ID_WINDOW_TEST; 
form1.Controls.Add(windowTest); 

MasterPage.Master

function MyFunc(){ 
    var win = GetWindow("<%= My.Namespace.Consts.ID_WINDOW_TEST %>") 
} 
我可以動態創建 Window控制和使用常數控制的 ID的價值實現這一目標

我現在的問題是:你如何處理這種情況?當您遇到這種情況時,您是否動態創建所有控件(如上面的示例中所示),並且使用此方法是否存在任何缺陷設計師不再顯示控件?或者你說「擰它,沒有人會改變該控制的ID」,並將其硬編碼在您的代碼?或者你有其他方法來處理這種情況?

我個人很喜歡第一個選項(重構),因爲a)它確保對ID的更改不會破壞我的代碼,並且b)我幾乎從不使用Designer,但我想我會在SO上提出這個問題來獲得一些有價值的意見。

在此先感謝所有回覆。

問候,

的Glu

更新/澄清

我通過,說明該代碼段被放置在同一個文件作出這一問題的第一個版本的一個小錯誤。由於控件和JavaScript方法都位於同一個文件中,因此不需要動態創建控件並使用常量定義控件的ID;通過直接在.aspx文件中定義控件,我可以在JavaScript方法中使用它的ID,如下所示:GetWindow("<%= windowTest.ID %>");

但是,我的問題是另一個;控件和JavaScript方法都放置在不同的文件中,在這種情況下,使用控件的ID的上述方法不再適用。因此,我將我的問題中提到的解決方案與控件的不斷創建和動態創建相結合。我現在糾正了我的問題中的兩個文件名,以便描述與我的問題相關的正確方案。

回答

0

在4.0中,您可以很好地控制在主/內容頁面情況下生成的客戶端ID。但我相信如果有人在一個地方在頁面中手動更改ID,而不是在JavaScript代碼中,它仍然是一個問題。如果你是唯一一個將要處理這段代碼的人,那麼你可以始終保持警惕並正確地重構。否則,您可以進入常量選項或將ID存儲在單獨的資源文件中。

+0

感謝您的意見。我查看了ASP.NET 4.0附帶的'ClientIDMode'屬性。有'Static'模式,看起來像我的問題的解決方案,因爲'ClientID'將與'ID'相同。然後,我可以寫'GetWindow(「<%= windowTest.ClientID%>」),一切都會正常工作。如果有人要更改ID,當然,它會在運行時崩潰。但是再一次,使用'ClientIDMode =「Static」'確實比硬編碼字符串更好。 – 2010-07-06 10:56:25

+0

是的,我想它比硬編碼的字符串更好。 – 2010-07-06 11:30:46

0

在我opionion有一兩個合適的解決方案:

1)使用jQuery框架得到阿霍德要通過JavaScript來ADRESS的HTML元素。 JQuery旨在能夠使用自動生成的分層創建的控件ID
2)使用.net Framework 4.0並且不使用自動生成的控件ID。 (我聽說這是4.0中的新功能,我認爲在你的情況下可能值得嘗試)

+0

感謝您的回覆。實際上,我使用的是一個組件框架,它帶有一個客戶端API,所以不幸的是,jQuery不是一個選項。我將看看ASP.NET 4.0功能,儘管該項目使用ASP.NET 3.5,所以我不知道過渡是否會很快發生。 – 2010-07-06 07:43:49

0

看看裏克斯特拉爾的博客文章標題爲「A generic way to find ASP.NET ClientIDs with jQuery」......它似乎有一些好點子這可能對你有一些幫助。

他使用jQuery作爲第一響應者的建議,但它的方式是使用ASP.NET的內置ClientID屬性來獲取ASP.NET生成的實際ID,並使用客戶端友好機制使您能夠編寫不會因ID更改而中斷的腳本代碼引用控件。

+0

感謝您的鏈接。正如我在對citronsas的回答中所提到的,我正在使用一個組件框架,它本身帶有一個自己的客戶端API。這意味着我必須使用我的問題中提到的'GetWindow'方法來改變客戶端的窗口外觀,例如, 'GetWindow( 'myObject的')。的setSize(400400)'。 – 2010-07-06 10:17:13