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

时间:2009-09-11 16:53:12

标签: asp.net-mvc

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

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

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

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

感谢。

3 个答案:

答案 0 :(得分: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()}
);

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

Stephen Walther博客的详细信息: ASP.NET MVC Tip #30 – Create Custom Route Constraints

答案 1 :(得分:1)

对于管理员资料,只需使用[Authorize]属性进行标记即可。要确保只有管理员可以使用它,请执行[Authorize(Roles = "Admin")]之类的操作。查看 this question

另外,/ product / create是最常见的,我认为:)

答案 2 :(得分:1)

I3Dx肯定对Authorize属性有正确的指导,这对于保持控制器安全至关重要,您可以应用于控制器或单独的操作。

就URL深度而言,我不担心深度,我会更关注路由是否具有逻辑意义,例如:

domain.com/admin/products/edit/1

domain.com/admin/groups/edit/1

domain.com/products/view/1

domain.com/groups/view/1

通过这种方式,您可以了解每条路线的情况。很明显,一个是管理员,一个是最终用户。

最简单的检查方法是让某人阅读您的网址并询问他们希望看到的内容。

希望这有帮助。

OH和最后一件事,对于客户端路线,我们经常使用“slugs”而不是id,以便它更具可读性。因此,当有人创建产品时,我们会对名称进行细化,以便可以在以下路线中使用:

domain.com/products/view/big-red-bucket

而不是

domain.com/products/view/1