2010-04-05 83 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的数据。主持人是将被单元测试的作品。从你的第二个陈述看来,你可能需要这个页面的多个主持人,但我需要更多的细节来确定。

相关问题