我的问题可能很基础,但我想要构建一个设计良好的Web应用程序。 对于任何管理区域,管理员都应该能够列出/创建/删除/修改用户、文章、帖子等。
我想知道设计应用程序的最佳方式是什么。 我应该为每个项目创建一个控制器(如/Users/Create/id或/Posts/Delete/id),还是在我的Administration控制器中创建所有操作(如/Administration/CreateUser/id或/Administration/DeletePost/id)?
我的问题可能很基础,但我想要构建一个设计良好的Web应用程序。 对于任何管理区域,管理员都应该能够列出/创建/删除/修改用户、文章、帖子等。
我想知道设计应用程序的最佳方式是什么。 我应该为每个项目创建一个控制器(如/Users/Create/id或/Posts/Delete/id),还是在我的Administration控制器中创建所有操作(如/Administration/CreateUser/id或/Administration/DeletePost/id)?
为了使控制器类保持清晰的职责分离,您应该为每个实体编写单独的控制器。如果只有一个控制器,则只会有一个Views目录,其中包含数十个视图,而且您的控制器将包含数十个方法,这很快就会变得难以管理。
我目前正在为一家大客户使用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)。
我会建立一个新的MVC网站来处理管理工作。
只要你将数据和业务逻辑分别放在不同的程序集中,你就有了更灵活的解决方案。然后,你可以将你的网站发布到子域名下,例如admin.yoursite.com。这样你就不必去修改路由,而且你可以将它们保留在单独的视图中,这是我认为最优雅的解决方案。
听听专家的意见也是好的。
我正在开发一个需要相同管理站点的项目,但我还没有做到这一步,所以这个问题对我很有兴趣。
我建议使用这个解决方案。
但是我将定义更改为:
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"
};
}
默认主题是默认的,因此必须存在。
目录结构如下:
这是另一种问我的问题的方式。
我的母版页的一部分:
<% 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)时,它变得非常混乱。
我更喜欢每个实体使用一个控制器,但是我找不到一种方法将此方法与多个控制器绑定。
这取决于您的管理区域规模大小,我建议您考虑以下几点(或者可能需要记录一下):
然后您可以指定哪种方法可以帮助您,例如:使用一个管理控制器、在实体控制器中使用管理操作,或者在大型功能应用程序的情况下定义一个新的管理项目。
*如果项目规模快速增长并且很快需要大规模处理,我会选择第三种方法-创建一个新的管理MVC项目。
希望这能帮助您做出决策。