28

我的问题可能很明显,但我想构建一个设计良好的 Web 应用程序。对于任何管理区域,管理员应该能够列出/创建/删除/修改用户、文章、帖子等...

我想知道设计应用程序的最佳方法是什么。我应该为这些项目中的每一项(/Users/Create/id 或 /Posts/Delete/id)创建一个控制器,还是在我的管理控制器中创建所有操作(/Administration/CreateUser/id 或 /Administration/DeletePost/ ID) ?

4

8 回答 8

14

您应该为每个实体编写一个单独的控制器,以保持控制器类的关注点清晰分离。如果你只有一个控制器,那么你就只有一个 Views 目录,里面有几十个视图,你的控制器会包含几十个方法,很快就会变得无法管理。

于 2009-05-25T06:59:41.107 回答
1

答案取决于控制器中有多少功能。只需从一个控制器开始,如果它太多,将它分成几个。MVC 的伟大之处在于您将内容放入控制器中的位置不必对 URL 产生任何影响。您可以非常轻松地将 /Users/Create 映射到例如 UserAdminController 类。

于 2009-05-25T06:58:27.473 回答
1

我只想建立一个新的 MVC 网站来处理管理。只要您将数据和业务逻辑分离到不同的程序集中,您就有一个更灵活的解决方案。然后,您可以将您的网站发布到子域,例如 admin.yoursite.com。这样您就不必弄乱您的路线,并且可以将它们保存在单独的视图中,恕我直言,这是最优雅的解决方案。Pro's 和 Con's 会很高兴听到。

我正在开发一个需要相同管理站点但还没有那么远的项目,所以这个问题让我很感兴趣。

于 2009-05-25T07:01:54.627 回答
1

我目前正在将 ASP.NET 用于大型客户端。

我采用的方法是将动作的功能放到另一个类中。

例子

我也在写一个管理部分。将有一个管理控制器(我们的管理部分很小,如果它更大,我会更改路由以允许更多控制器,现在我们正在使用开箱即用的配置)。如果我创建一个“EditUser”视图。我还将创建一个“EditUserAction”。所有 EditUser 代码都将进入该类。我在 Edit User 方法的 Administration 控制器类中构造了 EditUserAction 类。这会从 Controller 类中删除所有特定于操作的代码。这样,所有特定于动作的代码要么在动作方法中,要么在动作类中。否则,控制器将很快被各种操作的代码溢出。控制器类会在短时间内膨胀到无法控制的混乱状态。

类示例

public class Administration: Controller
{
    public ActionResult EditUser(string userId)
    {
        EditUserAction action = new EditUserAction();
    }
}

public class EditUserAction
{
    public void Save(User user)
    {   
        //save code here
    }
}

我希望这个解释是清楚的。如果不让我知道,我会澄清的。

为了回答您的问题,我正在做后者(/Administration/CreateUser/id/Administration/DeletePost/id)。

于 2009-05-25T07:32:29.980 回答
0

您可以为此使用DynamicData 。它不是 MVC,但可以与它一起使用,并且非常易于设置和使用。

于 2009-05-25T06:57:30.907 回答
0

这是问我问题的另一种方式。

我的母版页的一部分:

<% if (!String.Equals(ViewContext.RequestContext.RouteData.GetRequiredString("controller"), "Administration")) { %>
<div>
    <!-- Some Code -->
</div> <% } %>

如您所见,在我的母版页中,我想显示页面的某些部分,这取决于是否在管理区域工作的用户。它仅适用于管理控制器(/Administration/CreateUser/id)...但是当我使用不同的控制器作为用户或文章(/User/DeleteUser/id 或 /Article/Details/id)时,它变得一团糟.

我更喜欢每个实体使用一个控制器,但我找不到将这种方法与多个控制器绑定的方法。

于 2009-05-25T08:59:27.777 回答
0

我建议使用这个解决方案

但是我将定义更改为:

    public ThemedViewEngine()
    {
        base.MasterLocationFormats = new string[] {
            "~/Views/{1}/{0}.master", 
            "~/Views/Shared/{0}.master",
            "~/Themes/{2}/Views/{1}/{0}.master", 
            "~/Themes/{2}/Views/Shared/{0}.master",
            "~/Themes/Default/Views/{1}/{0}.master", 
            "~/Themes/Default/Views/Shared/{0}.master"
        };
        base.ViewLocationFormats = new string[] { 
            "~/Views/{1}/{0}.aspx", 
            "~/Views/{1}/{0}.ascx", 
            "~/Views/Shared/{0}.aspx", 
            "~/Views/Shared/{0}.ascx",
            "~/Themes/{2}/Views/{1}/{0}.aspx", 
            "~/Themes/{2}/Views/{1}/{0}.ascx", 
            "~/Themes/{2}/Views/Shared/{0}.aspx", 
            "~/Themes/{2}/Views/Shared/{0}.ascx",
            "~/Themes/Default/Views/{1}/{0}.aspx", 
            "~/Themes/Default/Views/{1}/{0}.ascx", 
            "~/Themes/Default/Views/Shared/{0}.aspx", 
            "~/Themes/Default/Views/Shared/{0}.ascx" 
        };
        base.PartialViewLocationFormats = new string[] {
            "~/Views/{1}/{0}.aspx",
            "~/Views/{1}/{0}.ascx",
            "~/Views/Shared/{0}.aspx",
            "~/Views/Shared/{0}.ascx",
            "~/Themes/{2}/Views/{1}/{0}.aspx",
            "~/Themes/{2}/Views/{1}/{0}.ascx",
            "~/Themes/{2}/Views/Shared/{0}.aspx",
            "~/Themes/{2}/Views/Shared/{0}.ascx",
            "~/Themes/Default/Views/{1}/{0}.aspx",
            "~/Themes/Default/Views/{1}/{0}.ascx",
            "~/Themes/Default/Views/Shared/{0}.aspx",
            "~/Themes/Default/Views/Shared/{0}.ascx"
        };
    }

默认主题是默认的,所以它必须存在。

目录结构将是:

  • 内容
  • 主题
    • 默认
      • 内容
      • 意见
        • 博客
        • 什么都应该剥皮
    • 其他主题
      • 内容
      • 意见
        • 博客
        • 什么都应该剥皮
  • 意见
    • 文章
    • 帖子
    • 用户
    • 设置
    • 其他行政事务
于 2009-08-11T15:18:54.057 回答
0

这取决于您的管理区域的规模大小,我建议您考虑执行以下操作(或者可能记录一下)

  • 考虑您要独立管理多少个实体,
  • 考虑每个人会有多少动作,
  • 检查您的应用程序和管理区域之间是否存在任何依赖关系(用户访问,对于用户友好的 URL)

然后您可以指定哪种方法可以帮助您,拥有一个管理控制器,实体控制器中的管理操作,或者在大型功能应用程序的情况下定义一个新的管理项目。

*如果项目规模正在快速增长并且很快需要大规模,我会选择第三个 - 拥有一个新的 admin mvc 项目。

我希望它能帮助你做出决定。

于 2013-07-08T06:41:14.873 回答