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 – 创建自定义路由约束