【问题标题】:ASP.NET MVC How many levels deep should a view or URL be?ASP.NET MVC 视图或 URL 应该有多少层?
【发布时间】:2010-11-27 13:54:27
【问题描述】:

我还在学习 ASP.NET MVC。使用 webforms,我会创建一个新文件夹,我们称之为 admin。在那里我可能有许多页面用于 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”控制器中还是应该将其分离到“product”控制器中?

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

谢谢。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

    针对您的具体问题:

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

      /管理员/产品/创建

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

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

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

    您甚至可以为站点中的“管理员”视图创建自定义路由,并通过在 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

    【讨论】:

      【解决方案2】:

      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

      这样你就知道每条路线发生了什么。很明显,一个是管理员,一个是最终用户。

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

      希望这会有所帮助。

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

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

      而不是

      domain.com/products/view/1

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 谢谢,我还没到授权用户的地步。我只是想看看我应该如何形成我的 URL。或者一些很好的建议。 :)
        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2011-01-01
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        • 2012-08-21
        相关资源
        最近更新 更多