MVC使用ASP.NET webforms

时间:2008-12-10 16:06:38

标签: model-view-controller webforms

我继承了构建在webforms之上的ASP.NET应用程序,并且该应用程序的所有业务逻辑都嵌入在代码隐藏中。因此,此应用程序无法进行单元测试。

我想将每个表单的功能分解为MVC样式,但我发现ASP.NET拒绝我为重构它而付出的每一个努力。一般来说,我喜欢按如下方式分离我的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
    }
}

一旦我设置了类并进行了单元测试,我就可以在我的usercontrol或页面上实现ILoginView接口:


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

如果这是一个winform应用程序,它会很漂亮。但是ASP.NET生命周期导致这种风格崩溃。

  • ASP.NET在每个页面加载时创建并销毁视图。由于我的Controller由View持有,模型由Controller持有,每次回发都会导致我的页面失去状态。

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

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

我知道我正在思考这个问题并且有更简单的方法来获得我想要的结果,但是如何使用webforms正确实现MVC风格呢?

4 个答案:

答案 0 :(得分:1)

使用asp.net mvc重写这个不容易吗?

答案 1 :(得分:1)

因为看起来你不得不重写。完全是MVC(并停止使用DNN),或更好的WebForms实现(意味着,从显示中分离逻辑并考虑页面生命周期问题)。还有第三个选项 - 结合MVC和ASP.NET WebForms,但是你应该仔细考虑它,同时考虑你平台中的所有变量。

答案 2 :(得分:0)

POSTback的性质决定了你的状态变化,所以你应该对此作出反应。您使用的任何框架都将以相同的方式工作,它将使用每个请求重建/绑定状态。您应该查看savind状态(读取数据)到您的用户会话中。

答案 3 :(得分:0)

ViewState应该用于在WebForms中存储所有已加载的数据,因此只有在创建页面时才会对Controller进行实例化,从而无需在用户会话中存储任何对象。