【问题标题】:MVC using ASP.NET webforms使用 ASP.NET 网络表单的 MVC
【发布时间】:2008-12-10 16:06:37
【问题描述】:

我继承了一个基于 Web 表单构建的 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
    }
}

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


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

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

  • ASP.NET 在每次页面加载时创建和销毁视图。由于我的 Controller 由 View 持有,而 Model 由 Controller 持有,每次回发都会导致我的页面丢失其状态。

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

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

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

【问题讨论】:

  • 如果您必须坚持使用 DNN,那么我想说您最好的选择是坚持使用 Web 表单实现,并从背后的代码中清除您的业务逻辑。 MVC 做得很好,但正如您所发现的那样,尝试混合模型很困难。 Web 表单还不错,只是与 MVC 不同。拥抱网络表单的优点。

标签: model-view-controller webforms


【解决方案1】:

用asp.net mvc重写这个不是更简单吗?

【讨论】:

  • 不,该项目基于DotNetNuke,因此与ASP.NET MVC不兼容。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 2017-02-11
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多