2011-09-13 73 views
1

我正在構建一些Web用戶控件,只是想知道什麼是實現屬性的正確/最佳實踐方法。在這個例子中,他的控制是一個「記分卡」控制,它必須顯示一個分數(並且還必須做其他的事情)....使事情變得更容易我使這些代碼示例非常簡單,但實際上我的控制其他東西,以及與除了在標籤中顯示它:-)ASP.NET Web用戶控件最佳實踐

Choice #1 
private int _score; 
public int Score 
{ 
get { return _score; } 
set { _score = value; Refresh(); } 
} 
public void Refresh() 
{ 
lblScore.Text = Score; 
} 


Choice #2: 
public int Score {get;set;} 
protected void PageLoad(object sender, EventArgs e) 
{ 
Refresh(); 
} 
private void Refresh() 
{ 
lblScore.Text = Score; 
} 


Choice #3: 
     public int Score 
    { 
    get { lblScore.Text; } 
    set { lblScore.Text = value; } 
    } 

比分等等,當然,問題是什麼是實現控制的分數屬性的最佳實踐方式....: - )

MadSeb

回答

0

選擇1

  • 選擇2不在此列,因爲您不應將初始化和功能鏈接到UserControl中的特定頁面事件。這是與Page-Lifecycle相關的惡意錯誤的來源。您可能希望在Page_Load後進行修改(即在頁面中按鈕的Click事件中),但對於隱式Refresh來說太遲了。
  • 選擇3因爲只是簡單地設置Label的文本而不希望有人記住他必須在設置Score之後調用Refresh。但這取決於多麼昂貴「我的控件除了在標籤中顯示它之外還有其他東西以及得分」。如果您經常更改分數,但不一定需要立即刷新,那麼在完成所有初始化後,我會執行Refresh

在我看來,一個UserControl應該封裝複雜性,只要它保持足夠的靈活性和可重用的控制。不要在背景中做太多「魔術」的事情,可能會導致不同情況下的錯誤,而您不會很快發現錯誤。特別是在Setter中通常只應設置相應的變量。

有兩種不同的使用情況的用戶控件:

  1. 複用性。 如果你的控件只包含很少的控件,但是你想重複使用很多次,我會讓控制器獲取/設置屬性,並且不要在其中執行取決於具體條件的複雜事情。這會降低可重用性。您可能想要提供控制器可以處理的明確方法和事件。
  2. 容器。 如果你的控件的行爲類似於一個頁面並且有很多控件和功能,它應該最重要的是它本身。你只想提供一些方法和事件(不必一定要處理)。在這種情況下最重要的方法是例如一個public void BindData(),它在控制器設置了必要的變量後進行所有初始化。這是您的Choice 2的替代品。

注意:如果你的分數是存儲在lblScore.Text作爲字符串無論如何,我寧願使用標籤的Text屬性,而不是創造另一個INT-變量(它轉換爲int的吸氣劑)。這具有以下優點:您無需手動將變量存儲在ViewState中,因爲它已存儲。通過這種方式,您無需在每次回發時進行設置。