Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在MVP模式中,视图应该如何吸引演示者_Asp.net_Mvp - Fatal编程技术网

Asp.net 在MVP模式中,视图应该如何吸引演示者

Asp.net 在MVP模式中,视图应该如何吸引演示者,asp.net,mvp,Asp.net,Mvp,我有一个ASP.NETWebForms应用程序,我在视图中使用一些动态控件,这些控件取决于演示者公开的内容。在这种情况下,视图是否可以拉动演示者获取该数据?在考虑可测试性和松耦合设计时,有什么我应该特别小心的吗 本例中的页面有自己的页面生命周期,演示者不知道这一点。但是,页面生命周期规定某些事情必须在页面生命周期的特定时刻发生。这闻起来像是麻烦。。。有已知的陷坑吗 编辑 当我的具体视图点击Init事件时,它将拉动presenter获取一个集合,这将导致创建一组ASP.NET服务器控件。我想知道这

我有一个ASP.NETWebForms应用程序,我在视图中使用一些动态控件,这些控件取决于演示者公开的内容。在这种情况下,视图是否可以拉动演示者获取该数据?在考虑可测试性和松耦合设计时,有什么我应该特别小心的吗

本例中的页面有自己的页面生命周期,演示者不知道这一点。但是,页面生命周期规定某些事情必须在页面生命周期的特定时刻发生。这闻起来像是麻烦。。。有已知的陷坑吗

编辑
当我的具体视图点击Init事件时,它将拉动presenter获取一个集合,这将导致创建一组ASP.NET服务器控件。我想知道这是否是一件特别糟糕的事情。。。演示者不知道如何响应页面生命周期初始化事件,但必须知道视图是否要填充动态控件。

在我看来,演示者是视图应该从/绑定到/等处获取数据的地方。演示者是要进行单元测试的部分。从你的第二句话来看,这个页面可能需要多个演示者,但我需要更多的细节来确定。

这是一个令人烦恼的问题-当你想在ASP.NET web表单中使用动态控件时,你必须从两个缺点中选择较小的一个。归根结底,这取决于您想要做出的妥协:视图中的presenter关注点或presenter中的view关注点

当我在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
或您可能称之为的任何地方)来获取Country

我可以看出替代方案的吸引力:

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 ...
    }
}
受保护的无效页\u Init(对象发送方、事件args args){
if(Request.Form[“StateList”]!=null){
List countries=presenter.getcountries(Request.Form[“StateList”]);
//…创建县下拉列表。。。
}
}
Presenter
的语义非常清晰-很容易理解
getcountries
的功能,它与页面生命周期没有任何关系。但是在你的视图中有可测试的东西,这是一个令人沮丧的问题,这通常比让我的演示者不知道他们的视图引擎更重要


另一种方法是在页面初始化期间加载整个模型。您的服务器控件值将不可用,因此您必须从
Request.Form
获取这些值中的任何一个。不过,这并不是惯用的ASP.NET经典版本,因为大多数web窗体开发人员习惯于直接从web控件获取值,而不是直接从POST数据获取值。我仍然不清楚演示者为什么需要了解页面生命周期。演示者不只是给视图提供一个集合吗?服务器控件不是在视图中创建和呈现的吗?感谢您提供了一个非常有见地的答案,糟糕的是,我不能对您竖起大拇指。在我看来,这是没有对错的,它将归结为什么是可测试的,以及那些重要的属性。