2010-04-05 86 views
0

我有一個ASP.NET Web窗體應用程序,我在視圖中使用了一些動態控件,這些控件取決於演示者公開的內容。在這種情況下,查看這些數據的主持人是否可行?在考慮可測試性和鬆散耦合設計時,我是否應該特別注意?視圖如何應用MVP模式中的Presenter

這種情況下的頁面有它自己的頁面生命週期,並且演示者不知道這一點。然而,頁面生命週期表明,某些事件必須發生在頁面生命週期的特定時刻。這聞起來像麻煩......任何已知的坑下降?

編輯

當我的具體看法打Init事件將會拉動演示一個集合,它會導致一堆ASP.NET服務器控件的創建。我想知道這是否是一件特別糟糕的事情...演示者不知道如何響應頁面生命週期初始化事件,但它必須如果視圖要用動態控件填充。

+0

我還不清楚爲什麼主持人需要知道頁面的生命週期。主持人是不是僅僅爲視圖提供一個集合?服務器控件是不是在視圖中創建和渲染的? – BlackICE 2010-04-05 14:38:25

回答

1

這是一個棘手的問題 - 當你想在ASP.NET Web窗體中使用動態控件時,你必須選擇兩個惡意中較小的一個。最終,這歸結於您想要達成的妥協方案:演示者在視圖中擔憂或擔心演示者的擔憂。

當我在網頁表單的工作,我通常更喜歡後者 - 我接受了主持人是聯繫在一起的ASP.NET頁面的生命週期,並創建一個InitializeView方法做任何有必要創建動態控件:

// Presenter 
// This could also be parameterless if you prefer that idiom but 
// then the view needs a SelectedState property that serves up values 
// straight from the Form collection, and it won't be obvious why. 
public void InitializeView(string selectedState) { 
    if (selectedState != null) { 
     view.Counties = dataLayer.GetCounties(selectedState); 
    } 
} 

// View 
protected void Page_Init(object sender, EventArgs args) { 
    presenter.InitializeView(Request.Form["StateList"]); 
    // ... build counties drop-down ... 
} 

當然,這會將演示者的語義與ASP.NET生命週期聯繫起來,並遮蔽了該方法中正在發生的事情。您可以通過給予InitializeView一個更具描述性的名稱(如ProcessSelectedState)來緩解這種情況,但除非方法名稱引用頁面生命週期,否則它永遠不會很明顯,爲什麼您不只是讓其他模型的縣(在presenter.LoadModel或其他你可以稱它)。

我可以看到替代是如何吸引人:

protected void Page_Init(object sender, EventArgs args) { 
    if (Request.Form["StateList"] != null) { 
     List<string> counties = presenter.GetCounties(Request.Form["StateList"]); 
     // ... build counties drop-down ... 
    } 
} 

Presenter的語義是非常明確 - 這是很容易理解什麼GetCounties不和它沒有任何與頁面生命週期。但是在你看來,你有可測試的東西,這是一件令人失望的事情,而這通常比讓我的演示者不理解他們的視圖引擎更重要。

另一種替代方法是在頁面初始化期間只加載您的整個模型。您的服務器控制值將不可用,因此您必須從Request.Form中獲取任何這些值。這雖然不是慣用的ASP.NET經典 - 但它可能會讓人過度困惑,因爲大多數Web表單開發人員習慣於直接從Web控件獲取值,而不是直接從POST數據獲取值。

+0

謝謝你一個非常有見地的答案,不好我不能給你幾個大拇指。在我看來,這不是對還是錯,它會歸結爲什麼是可測試的和那些重要的屬性。 – 2010-04-07 16:19:12

0

國際海事組織的主持人是視圖應該從/綁定到/ etc的數據。主持人是將被單元測試的作品。從你的第二個陳述看來,你可能需要這個頁面的多個主持人,但我需要更多的細節來確定。

相關問題