ASP.NET MVC视图或URL应该有多少级别?

vin*_*w56 7 asp.net-mvc

我还在学习ASP.NET MVC.使用webforms,我会创建一个新文件夹,让我们称之为管理员.在那里,我可能有很多页面用于create_product,edit_product等.因此URL可能看起来像http://somesite.com/admin/create_product.aspx.

但是对于MVC来说,它有点不同.我试图看看这是最好的方法.

http://somesite.com/admin/product/create做对吗?或者它应该只是http://somesite.com/product/create?如果我是第一种方式,我是否将所有内容都放在"admin"控制器中,还是应该将其分成"产品"控制器?

我知道这可能是主观或个人选择,但我想得到一些建议.

谢谢.

Tod*_*odd 11

ASP.NET MVC的一部分好处(更一般地说,.NET 3.5 SP1中所有ASP.NET共有的URL路由引擎)的特点是URL可以灵活配置为映射到您喜欢的任何文件夹/文件结构.这意味着在开始构建项目之后,比WebForms更容易修改URL.

针对您的具体问题:

  • 一个管理控制器与产品控制器 - 通常,指导是保持控制器的重点,以便更容易测试和维护.出于这个原因,我建议在每个对象类型(如Product)中使用单个控制器和CRUD操作.你的案例中的例子:

    /管理/产品/创建

    / admin/product/edit/34或/ admin/product/edit/red-shoes(如果名称是唯一的)

    在任何一种情况下,Create,Edit,Deatils操作都将在ProductController中.您可能只有"管理操作"(如"创建"和"编辑")的自定义路由限制其使用(并将"管理"文本添加到URL),然后"详细信息"操作将可供您站点的所有访问者使用.

  • 保护管理员视图 - 使用MVC记住一个重要事实:所有请求都直接转到控制器,而不是视图.这意味着旧的"使用web.config保护目录"不适用于(通常)MVC以保护您的管理员.相反,您现在应该将安全性直接应用于控制器.这可以通过使用Controller类的属性轻松实现,例如:
    • [授权] - 只检查用户是否已登录
    • [授权(角色="管理员")] - 限制为特定用户角色
    • [授权(用户="乔")] - 限于特定用户

您甚至可以在站点中为"管理"视图创建自定义路由,并通过在URL路由中强制执行授权检查来限制对这些视图的访问,如下所示:

routes.MapRoute(
  "Admin",
  "Admin/{controller}/{action}",
  new { controller = "Product", action = "Index" },
  new { authenticated= new AuthenticatedConstraint()}
);
Run Code Online (Sandbox Code Playgroud)

AuthenticatedConstraint的位置如下:

using System.Web;
using System.Web.Routing;
public class AuthenticatedConstraint : IRouteConstraint
{
  public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
  {
    return httpContext.Request.IsAuthenticated;
  }
}
Run Code Online (Sandbox Code Playgroud)

有关Stephen Walther博客的详细信息: ASP.NET MVC提示#30 - 创建自定义路由约束