ASP.NET MVC中的管理区域

28

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

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


3
好问题,我在开始学习MVC时也有类似的疑虑。 - Chuck Conway
8个回答

14

为了使控制器类保持清晰的职责分离,您应该为每个实体编写单独的控制器。如果只有一个控制器,则只会有一个Views目录,其中包含数十个视图,而且您的控制器将包含数十个方法,这很快就会变得难以管理。


1

我目前正在为一家大客户使用ASP.NET。

我的方法是将操作的功能放入另一个类中。

例如

我也正在编写一个管理部分。将有一个Administration控制器(我们的管理部分很小,如果它更大,我会更改路由以允许更多的控制器,但现在我们正在使用开箱即用的配置)。如果我创建一个“编辑用户”视图。我也会创建一个“EditUserAction”。所有的EditUser代码都将进入这个类。我在Administration控制器类中的Edit User方法里构建EditUserAction类。这样可以将所有与操作相关的代码从控制器类中移除出去。这种方式使得所有与操作相关的代码要么在操作方法中,要么在操作类中。否则,控制器类很快就会被各种操作的代码淹没。控制器类很快就会变成难以管理的混乱。

类的例子

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)。


我理解你的方法,但在我的管理控制器中,这将会是一个非常混乱的局面!我正在构建一种类似电子商务/价格比较的Web应用程序,我的管理区域肯定会迅速增长!我认为我会建立一个新的MVC网站来处理管理工作,即使我的老板们不希望这样做。 - Flesym

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

1

我会建立一个新的MVC网站来处理管理工作。

只要你将数据和业务逻辑分别放在不同的程序集中,你就有了更灵活的解决方案。然后,你可以将你的网站发布到子域名下,例如admin.yoursite.com。这样你就不必去修改路由,而且你可以将它们保留在单独的视图中,这是我认为最优雅的解决方案。

听听专家的意见也是好的。

我正在开发一个需要相同管理站点的项目,但我还没有做到这一步,所以这个问题对我很有兴趣。


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"
        };
    }

默认主题是默认的,因此必须存在。

目录结构如下:

  • 内容
  • 主题
    • 默认
      • 内容
      • 视图
        • 主页
        • 博客
        • 任何应该有皮肤的东西
    • 其他主题
      • 内容
      • 视图
        • 主页
        • 博客
        • 任何应该有皮肤的东西
  • 视图
    • 文章
    • 帖子
    • 用户
    • 设置
    • 其他管理工具

0

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

我的母版页的一部分:

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

正如您所见,在我的主页面中,我想根据用户是否在管理区域工作来显示页面的某些部分。 如果仅使用Administration控制器(/Administration/CreateUser/id),它运行得非常好... 但是当我使用不同的控制器,例如User或Article(/User/DeleteUser/id或/Article/Details/id)时,它变得非常混乱。

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


如果您想像这样将管理集成到您的网站中,我认为最好采用用户方法。只需在主网站中实现所有内容,但仅向具有正确权限的人显示编辑/删除/创建操作。它不应该取决于所遵循的路线? - Peter

0

这取决于您的管理区域规模大小,我建议您考虑以下几点(或者可能需要记录一下):

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

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

*如果项目规模快速增长并且很快需要大规模处理,我会选择第三种方法-创建一个新的管理MVC项目。

希望这能帮助您做出决策。


0
你可以使用DynamicData来实现这个功能。虽然它不是MVC,但可以与之一起使用,并且非常容易设置和使用。

这可能是一个好主意,但我没有时间学习如何使用DynamicData并使其与MVC配合工作。 - Flesym
我最近在一个项目中使用了DynamicData,它的设置和使用都非常简单。最简单的方法是使用动态数据创建一个新项目,然后它就可以直接使用了。 - Rune Grimstad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接