【问题标题】:Large MVC controller for a web-based "Wizard" - what are some ways I could reduce size and redundancy?用于基于 Web 的“向导”的大型 MVC 控制器 - 有哪些方法可以减小大小和冗余?
【发布时间】:2012-07-24 23:51:01
【问题描述】:

我有一个非常大的(77 个动作)控制器,我用它来制作一个具有类似向导功能的网站。该站点就像一个“工作应用程序管理器”,具有多个组件,例如管理组件和最终用户组件。我正在使用的组件是用户实际填写工作申请的部分。事物与其他组件的结构方式,将所有作业应用程序的内容放在同一个控制器中是最有意义的。所有这些操作都在不同的模型上执行类似的操作,如下所示:

public class ExampleController : Controller
{
    public ActionResult Action1() 
    {
        Guid appId = new Guid(Session["AppId"].ToString());
        ... // logic to pull up correct model
        return View(model)
    }

    [HttpPost]
    public ActionResult Action1(FormCollection formValues)
    {
        Guid appId = new Guid(Session["AppId"].ToString());
        ... // logic to update the model
        return RedirectToAction("Action2");
    }

    public ActionResult Action2()
    {
        Guid appId = new Guid(Session["AppId"].ToString());
        ... // logic to pull up the correct model
        return View(model)
    }

    ... // on and on and on for 74 more actions
}

有什么方法可以减少每一个动作中的一些持续冗余?这是我的想法:

  • 创建一个成员变量 Guid 来存储 appId,然后重写 OnActionExecuting 来填充这个变量。这是个好主意吗?
  • 实施某种分页以减少操作数量。有关如何做到这一点的任何建议?

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    我会同意您的第一点,而“取决于”您的第二点。不要因为你有很多方法就改变你的设计,如果所有 77 个ActionResult 方法都有意义,那就保留它们。

    使用成员变量并覆盖 OnActionExecuting 似乎是将 appID Guid 代码重构到一个地方的好方法,因此您可以快速轻松修改它未来。

    【讨论】:

      【解决方案2】:

      通常对于向导视图,单个操作和页面与多个可以根据步骤显示的 div 一起使用。

      例如,一个有 4 个步骤的注册向导屏幕,可以在一个页面中处理,每个步骤都有 div。您可以使用 JavaScript 和 css 使其成为向导流程。

      如果需要,在步骤之间使用 ajax 更新不同的模型。

      【讨论】:

      • 我已经将这种方法用于较小的类似向导的网站,但对于拥有 70 个不同页面的网站来说,这不是一个好主意。这将需要很长时间才能加载。
      【解决方案3】:

      您可能希望将您的逻辑(与作业管理器相关)放在单个存储库/管理器类中。与不同视图关联的不同控制器(例如 AdminController、EndUserController 等)可以调用来自同一存储库/管理器类的方法。

      【讨论】:

        【解决方案4】:

        另一种选择可能是替换它..

        Guid appId = new Guid(Session["AppId"].ToString());
        

        ..调用类似以下内容:

        private Guid GetAppId(){
            return new Guid(Session["AppId"].ToString());
        }
        

        现在您可以只使用GetAppId() 而不是您当前使用appId 的任何地方。您当然可以按照您的建议以类变量的形式缓存 GUID,但最好将该变量的访问和使用限制为这样的方法(通过该方法获取它的值)。如果您以后想更改某些内容,可能会更灵活一些。

        至于把页面分成几页;当然,继续,如果它有意义并且感觉正确的话。一个类中有 70 多个动作听起来确实很多。但是,如果将它们保留在那里更有意义,您可以尝试将尽可能多的逻辑从方法本身移出,转入辅助类。我总是尽量保持操作尽可能小,并将逻辑放在单独的类中,每个类都针对做一件特定的事情而定制。

        我的观点是,如果每个动作不超过 2-4 行,那么 70+ 动作不一定是问题。

        【讨论】:

        • 我曾尝试按照您的建议使用 GetAppId() 方法,但因为我将 appId 变量与 LINQ 表达式一起使用,所以它不起作用。
        猜你喜欢
        • 1970-01-01
        • 2010-10-14
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 2011-12-11
        • 2011-04-09
        相关资源
        最近更新 更多