1

我有一个非常大的(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 来填充这个变量。这是一个好主意吗?
  • 实现某种分页以减少操作的数量。关于如何做到这一点的任何建议?
4

4 回答 4

2

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

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

于 2012-07-23T23:58:33.470 回答
1

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

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

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

于 2012-07-24T07:44:23.053 回答
0

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

于 2012-07-24T07:54:11.997 回答
0

另一种选择可能是替换这个..

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

..调用类似以下内容:

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

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

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

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

于 2012-07-24T10:33:36.297 回答