我的问题可能很明显,但我想构建一个设计良好的 Web 应用程序。对于任何管理区域,管理员应该能够列出/创建/删除/修改用户、文章、帖子等...
我想知道设计应用程序的最佳方法是什么。我应该为这些项目中的每一项(/Users/Create/id 或 /Posts/Delete/id)创建一个控制器,还是在我的管理控制器中创建所有操作(/Administration/CreateUser/id 或 /Administration/DeletePost/ ID) ?
我的问题可能很明显,但我想构建一个设计良好的 Web 应用程序。对于任何管理区域,管理员应该能够列出/创建/删除/修改用户、文章、帖子等...
我想知道设计应用程序的最佳方法是什么。我应该为这些项目中的每一项(/Users/Create/id 或 /Posts/Delete/id)创建一个控制器,还是在我的管理控制器中创建所有操作(/Administration/CreateUser/id 或 /Administration/DeletePost/ ID) ?
您应该为每个实体编写一个单独的控制器,以保持控制器类的关注点清晰分离。如果你只有一个控制器,那么你就只有一个 Views 目录,里面有几十个视图,你的控制器会包含几十个方法,很快就会变得无法管理。
答案取决于控制器中有多少功能。只需从一个控制器开始,如果它太多,将它分成几个。MVC 的伟大之处在于您将内容放入控制器中的位置不必对 URL 产生任何影响。您可以非常轻松地将 /Users/Create 映射到例如 UserAdminController 类。
我只想建立一个新的 MVC 网站来处理管理。只要您将数据和业务逻辑分离到不同的程序集中,您就有一个更灵活的解决方案。然后,您可以将您的网站发布到子域,例如 admin.yoursite.com。这样您就不必弄乱您的路线,并且可以将它们保存在单独的视图中,恕我直言,这是最优雅的解决方案。Pro's 和 Con's 会很高兴听到。
我正在开发一个需要相同管理站点但还没有那么远的项目,所以这个问题让我很感兴趣。
我目前正在将 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)。
您可以为此使用DynamicData 。它不是 MVC,但可以与它一起使用,并且非常易于设置和使用。
这是问我问题的另一种方式。
我的母版页的一部分:
<% if (!String.Equals(ViewContext.RequestContext.RouteData.GetRequiredString("controller"), "Administration")) { %>
<div>
<!-- Some Code -->
</div> <% } %>
如您所见,在我的母版页中,我想显示页面的某些部分,这取决于是否在管理区域工作的用户。它仅适用于管理控制器(/Administration/CreateUser/id)...但是当我使用不同的控制器作为用户或文章(/User/DeleteUser/id 或 /Article/Details/id)时,它变得一团糟.
我更喜欢每个实体使用一个控制器,但我找不到将这种方法与多个控制器绑定的方法。
我建议使用这个解决方案。
但是我将定义更改为:
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"
};
}
默认主题是默认的,所以它必须存在。
目录结构将是:
这取决于您的管理区域的规模大小,我建议您考虑执行以下操作(或者可能记录一下)
然后您可以指定哪种方法可以帮助您,拥有一个管理控制器,实体控制器中的管理操作,或者在大型功能应用程序的情况下定义一个新的管理项目。
*如果项目规模正在快速增长并且很快需要大规模,我会选择第三个 - 拥有一个新的 admin mvc 项目。
我希望它能帮助你做出决定。