我的问题可能很明显,但我想构建一个设计良好的Web应用程序。 对于任何管理区域,管理员应该能够列出/创建/删除/修改用户,文章,帖子等......
我想知道设计应用程序的最佳方法是什么。 我应该为每个项目(/ Users / Create / id或/ Posts / Delete / id)创建一个控制器,还是在我的管理控制器中创建所有操作(/ Administration / CreateUser / id或/ Administration / DeletePost / id)?
答案 0 :(得分:14)
您应该为每个实体编写一个单独的控制器,以便为控制器类保持清晰的关注点分离。如果你只有一个控制器,那么你只有一个带有几十个视图的视图目录,而你的控制器将包含许多方法,很快就会变得无法管理。
答案 1 :(得分:1)
答案取决于控制器的功能。刚开始使用一个控制器,如果它太多分裂成几个。 关于MVC的好处是你在控制器中放置东西不会对URL产生任何影响。您可以非常轻松地将/ Users / Create映射到例如UserAdminController类。
答案 2 :(得分:1)
我只想建立一个处理管理的新MVC网站。 只要您在不同的程序集中分离数据和业务逻辑,就可以获得更灵活的解决方案。然后,您可以将您的网站发布到子域名admin.yoursite.com。这样你就不必弄乱你的路线了,你可以将它们保存在不同的视图中,这是最优雅的解决方案。 Pro和Con's很高兴听到。
我正在开发一个项目,该项目需要相同的管理网站,但还没有那么远,所以这个问题对我很感兴趣。
答案 3 :(得分:1)
我目前正在为大型客户端使用ASP.NET。
我采用的方法是将动作的功能放到另一个类中。
示例强>
我也在写一个管理部门。将有一个管理控制器(我们的管理部分很小,如果它更大我会改变路由以允许更多控制器,现在我们使用开箱即用的配置)。如果我创建“EditUser”视图。我还将创建一个“EditUserAction”类。所有EditUser代码都将进入该类。我在Edit User方法的Administration控制器类中构造EditUserAction类。这将从Controller类中删除所有特定于操作的代码。这样,所有特定于操作的代码都在action方法或action类中。否则,控制器将很快被来自各种动作的代码溢出。控制器类会在短时间内导致无法控制的混乱。
课程示例
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 )。
答案 4 :(得分:0)
您可以使用DynamicData。它不是MVC,但它可以与它一起使用,它很容易设置和使用。
答案 5 :(得分:0)
这是提出问题的另一种方式。
我的母版页的一部分:
<% if (!String.Equals(ViewContext.RequestContext.RouteData.GetRequiredString("controller"), "Administration")) { %>
<div>
<!-- Some Code -->
</div> <% } %>
正如您所看到的,在我的母版页中,我想显示页面的某些部分,具体取决于在管理区域工作的用户。 它只适用于管理控制器(/ Administration / CreateUser / id)......但当我使用不同的控制器作为用户或文章(/ User / DeleteUser / id或/ Article / Details / id)时,它变得很乱
我更喜欢每个实体使用一个控制器,但我找不到将这种方法与多个控制器联系起来的方法。
答案 6 :(得分:0)
我建议使用this solution。
但是我将定义改为:
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"
};
}
默认主题是默认主题,因此必须存在。
目录结构将是:
答案 7 :(得分:0)
这取决于管理区域的比例尺寸, 我建议你考虑做以下(或者记录一下)
然后您可以指定哪种方法可以帮助您,拥有一个管理控制器,实体控制器中的管理员操作,或者在大型功能应用程序的情况下定义新的管理项目。
*如果项目规模快速增长并且很快需要大规模,我会选择第三个 - 拥有一个新的管理mvc项目。
我希望它可以帮助你做出决定。