Model view controller 使用ASP.NET webforms的MVC

Model view controller 使用ASP.NET webforms的MVC,model-view-controller,webforms,Model View Controller,Webforms,我继承了一个构建在webforms之上的ASP.NET应用程序,该应用程序的所有业务逻辑都嵌入到codebehind中。因此,无法对该应用程序进行单元测试 我想将每个表单的功能分解为MVC风格,但我发现ASP.NET抵制了我重构表单的所有努力。一般来说,我喜欢将我的MVC类划分如下: public class LoginModel { public string Username, Password; public bool IsAuthenticated; } public

我继承了一个构建在webforms之上的ASP.NET应用程序,该应用程序的所有业务逻辑都嵌入到codebehind中。因此,无法对该应用程序进行单元测试

我想将每个表单的功能分解为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或page上实现
ILoginView
界面:


public class LoginView : UserControl, ILoginView
{
    public LoginView() : base()
    {
        new LoginController(this); // registers view with the controller
    }
}
如果这是一个winform应用程序,它会工作得很好。但是ASP.NET生命周期导致这种样式崩溃

  • ASP.NET会在每次加载页面时创建和销毁视图。由于我的控制器由视图持有,模型由控制器持有,因此每次回发都会导致我的页面失去其状态

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

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


我知道我想得太多了,有一种更简单的方法可以得到我想要的结果,但是我如何使用webforms正确地实现MVC风格呢?

使用asp.net MVC重新编写这篇文章不是更容易吗?

因为您似乎必须重新编写。要么完全转向MVC(并停止使用DNN),要么转向更好的WebForms实现(这意味着,将逻辑与显示分离,并考虑页面生命周期问题)。还有第三种选择-结合MVC和ASP.NET WebForms,但您应该仔细考虑平台中的所有变量。

回发的本质是指示您的状态更改,因此您应该对此做出反应。您使用的任何框架都将以几乎相同的方式工作,它将重建/绑定每个请求的状态。您应该查看savind状态(读取数据)到用户会话中。

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

否,该项目基于DotNetNuke,因此,它与ASP.NET MVC不兼容。如果您必须坚持使用DNN,那么我认为您最好的选择是坚持使用web表单实现,并从代码中清除业务逻辑。MVC做得很好,但正如您所发现的,尝试混合模型是很困难的。Web表单并不坏,它只是不同于MVC。拥抱webforms的优点。