ASP.NET MVC 视图或 URL 应该有多少层深度?

7
我仍在学习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"控制器?
我知道这可能是主观的或个人选择,但我想得到一些建议。
谢谢。
3个回答

11
ASP.NET MVC(以及通用于 .NET 3.5 SP1 中所有 ASP.NET 的 URL 路由引擎)的好处之一是,URL 可以灵活配置以映射到任何您喜欢的文件夹/文件结构。这意味着,与 WebForms 时代相比,在开始构建项目后修改您的 URL 要容易得多。
对于您的具体问题:
- 对于一个对象类型(如 Product),建议保持控制器聚焦,使其更易于测试和维护。出于这个原因,我建议使用每个对象类型一个控制器(如 ProductController)和 CRUD 操作。在您的情况中的示例:
/admin/product/create /admin/product/edit/34 或 /admin/product/edit/red-shoes(如果名称唯一)
在任何情况下,Create、Edit 和 Details 操作都将在 ProductController 中。您可以为“管理操作”(如 Create 和 Edit)创建自定义路由来限制它们的使用(并在 URL 中添加“admin”文本),然后 Details 操作将可供站点的所有访问者使用。
- 在 MVC 中,所有请求都直接传递给控制器,而不是视图。这意味着旧的“使用 web.config 安全地安全目录”方法通常不适用于 MVC 来保护您的管理页面。相反,您现在应该直接将安全性应用到控制器上。这可以通过使用控制器类中的属性轻松实现,例如:
- [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 – 创建自定义路由约束


1

对于管理员的内容,只需标记[Authorize]属性。为确保只有管理员可以使用它,请执行以下操作:[Authorize(Roles = "Admin")]。看看 这个问题

此外,/product/create 是最常见的,我想 :)


谢谢,我还没到授权用户的阶段。我只是想知道该如何形成我的URL,或者有一些好的建议。 :) - vincentw56

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

这样你就知道每个路由都发生了什么。一个是管理员,另一个是终端用户是很明显的。

检查的最简单方法是请别人阅读您的URL并询问他们希望看到什么。

希望能帮到您。

哦,最后一件事,对于客户端路由,我们通常使用“slug”而不是ID,以使其更易读。因此,当有人创建产品时,我们会将名称转换为Slug,以便可以在路由中使用,例如:

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

而不是

domain.com/products/view/1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接