2008-12-10 79 views
2

我已经继承了基于webforms构建的ASP.NET应用程序,并且该应用程序因将其所有业务逻辑嵌入代码隐藏而受到影响。因此,此应用程序不能进行单元测试。我想将每种形式的功能分解为MVC风格,但是我发现ASP.NET拒绝我的每一个努力来重构它。在一般情况下,我喜欢我的单独MVC类如下:使用ASP.NET webforms的MVC


public class LoginModel 
{ 
    public string Username, Password; 
    public bool IsAuthenticated; 
} 

public interface ILoginView 
{ 
    event Action UserLoggedIn; 
    void SetMode(bool isAuthenticated); 
} 

public class LoginController 
{ 
    ILoginView View; 
    LoginModel Model; 

    public LoginController(ILoginView view, LoginModel model) 
    { 
     this.View = view; 
     this.Model = model; 

     // hook onto view events 
    } 
}

一旦我有我的课设置和很好的单元测试,我可以实现我的用户控件或页面ILoginView接口:


public class LoginView : UserControl, ILoginView 
{ 
    public LoginView() : base() 
    { 
     new LoginController(this); // registers view with the controller 
    } 
} 

如果这是一个winform应用程序,它将美化工作。但是,ASP.NET生命周期会导致这种风格崩溃。

  • ASP.NET创建并破坏每个页面加载的视图。由于我的控制器是由视图保存的,所以模型由控制器保存,每次回发都会导致我的页面失去其状态。

  • 我可以通过在用户会话中持有我的控制器来解决上述问题,但这会带来一系列问题。特别是,在会话中放置控制器会导致内存问题,因为在会话过期之前,模型和控制器不会被垃圾回收回收。从页面到页面的导航可创建数十个控制器,但是当用户离开页面时,控制器不会自行处理。

  • 由于视图在每次回发时被销毁/重新创建,因此我必须在每次回发时重新注册与控制器的视图。这比听起来更难,因为模型的状态需要在每次回发时被复制回View,但同时我们不想覆盖用户对上次回发中所做的View的更改。当处理使用此MVC风格的动态创建或AJAX控件时,您不知道会变成什么样的额外噩梦。

我知道我这得太多,有一个更简单的方式来获得我想要的结果,但我怎么正确地实现了MVC的风格使用的WebForms?

+0

如果你必须坚持使用DNN,那么我认为你最好的选择就是坚持使用Web表单实现,并且只是将代码背后的业务逻辑清理干净。MVC做的很好,但是试图混合模型很困难,正如你发现的那样。 Web表单并不差,它只是不同于MVC。拥抱webforms的好感。 – 2010-02-04 18:27:59

回答

1

使用asp.net mvc重写这个文件是不是更容易?

+0

不,该项目基于DotNetNuke,因此它与ASP.NET MVC不兼容。 – Juliet 2008-12-10 16:27:43

1

因为它似乎你必须重新写。无论是完全MVC(并停止使用DNN),或更好的WebForms实现(意思是,从显示分离逻辑,并考虑到页面生命周期问题)。还有第三种选择 - 结合MVC和ASP.NET WebForms,但您应该仔细考虑并考虑平台中的所有变量。

0

那么,回发的本质是支配你的状态变化,所以你应该对此作出反应。你使用的任何框架都会以几乎相同的方式工作,它会用每个请求重建/绑定状态。你应该看看你的用户会话中的状态(读取数据)。

0

ViewState应该用于将所有加载的数据存储在WebForms中,因此只有在创建页面时才可以实现控制器,无需在用户会话中存储任何对象。