但是对于MVC来说,它有点不同.我试图看看这是最好的方法.
做http://somesite.com/admin/product/create会对吗?或者应该只是http://somesite.com/product/create?如果我是第一种方式,我是否将所有内容都放在“admin”控制器中,还是应该将其分成“产品”控制器?
我知道这可能是主观或个人选择,但我想得到一些建议.
谢谢.
解决方法
针对您的具体问题:
>一个管理员控制器与产品控制器 – 通常,指导是保持控制器的重点,以便更容易测试和维护.出于这个原因,我建议在每个对象类型(如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