2009-09-11 15 views
7

我还在学习ASP.NET MVC。有了webforms,我会创建一个新的文件夹,我们称之为admin。在那里,我可能会有许多页面供create_product,edit_product等使用,因此URL可能看起来像http://somesite.com/admin/create_product.aspxASP.NET MVC视图或URL应该有多少层次?

但与MVC它有点不同。我正试图看看最好的办法是做什么。

会做http://somesite.com/admin/product/create是对的吗?或者它应该只是http://somesite.com/product/create?如果我以第一种方式进行操作,是否将所有内容都放在“管理员”控制器中,还是应该将其分解为“产品”控制器?

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

谢谢。

回答

11

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

为了您的具体问题:

  • 一个管理控制器与产品控制器 - 一般情况下,指导是保持控制器集中,使他们更容易测试和维护。出于这个原因,我建议使用CRUD操作的每个对象类型(如Product)使用单个控制器。

    /管理/产品/创建

    /管理/产品/编辑/ 34或/管理/产品/编辑/红鞋子(如果名是唯一的)

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

  • 保护管理视图 - 使用MVC记住的一个重要事实是:所有请求都直接转到控制器,而不是视图。这意味着旧的“使用web.config保护目录”不适用于(通常)MVC以保护您的管理员。相反,您现在应该直接将安全性应用于控制器。限于特定的用户角色 -
    • [授权] - 只需检查该用户登录
    • [授权(角色=“管理员”)]:这可以容易地通过使用属性到控制器类等实现
    • [授权(用户=“乔”)] - 限制对特定用户

你甚至可以创建“管理”,在您的网站,并限制访问这些观点通过实施意见自定义路线您的授权检查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; 
    } 
} 

好细节: ASP.NET MVC Tip #30 – Create Custom Route Constraints

1

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

此外,/产品/创建是最常见的,我觉得:)

+0

Thansks,我不是授权用户的点。我只想看看我应该如何形成我的网址。或者做一些很好的建议。 :) – vincentw56 2009-09-11 17:04:11

1

I3Dx绝对有对授权属性的正确引导,这是保持控制器的安全至关重要,你可以申请到一个控制器或个人行为。

至于URL深度,我就不会担心的深度,我会更关注的是,路线由例如逻辑意义:

domain.com/admin/products/edit/1

domain.com/admin/groups/edit/1

domain.com/products/view/1

domain.com/groups/view/1

你知道W本办法每条路线都会发生一次帽子。很明显,一个是管理员,一个是最终用户。

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

希望这会有所帮助。

OH和最后一件事情,对于客户端路线,我们经常使用“slugs”而不是id,以便它更具可读性。因此,当有人创建了一个产品,我们slugify名称,以便它可以在航线使用,如:

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

而不是

域。 com/products/view/1