使用Areas
MVC框架支持在areas(区域)里面组织一个web应用程序,每一个area呈现应用程序的一个功能段,比如管理,订单,客户支持等等。这对于一个大的项目是非常有用的,因为将所有的controller,model,view都只是放在一套文件夹里面(整个项目所有的Controller都在一个文件夹下)会非常难管理的。这时area就非常有用了,每一个area都有自己的一套文件结构,如Controller,View,Model,通过area就可以保持相对的分离。这样做可以让程序的每一个功能块划分的更加明确,当有很多的开发人员合作开发时也可以避免相互冲突。
下面会创建一个实例来说明Area的作用:
首先创建一个WorkingWithAreas项目使用Internet Application模版,接着创建一个名为Admin的Area。
完成以后,我们会发现Area里面其实是一个mini版的MVC项目,在Area目录下生成了一个类AdminAreaRegistration,这个类里面一个非常有意思的方法是RegisterArea,在这个方法里面藉着URL模式注册了一个路由,当然其他的路由也是在这里定义。如果你要给route传递一个名字而不是用null,那么route的名字必须是全局唯一的,不仅仅在该Area内唯一。我们不需要做其他的操作来确保该注册方法被调用,系统自动添加到了 Global.asax.cs里面的Application_Start方法里面,如:AreaRegistration.RegisterAllAreas();当调用这个的时候会让MVC框架遍历我们应用程序的所有类,并找出从AreaRegistration类派生的类,然后调用这些类里面的RegisterArea方法。
注意:不要改变在Application_Start方法里面与route有关的语句的顺序。如果我们在调用AreaRegistration.RegisterAllAreas方法之前,先去调用了RegisterRoutes方法,那么我们的route也要定义在area routes之前。假设routes是按照顺序被评估或匹配,这就意味着在对area里面的controller进行请求时可能会匹配到错误的路由。
AdminAreaRegistration类里面的public override void RegisterArea(AreaRegistrationContext context)方法有一个AreaRegistrationContext类型的参数,这个参数暴露了一套MapRoute方法来让我们在Area里面使用,跟我们在Global.asax.cs里面的RegisterRoutes方法里面使用MapRoute一样。这个有点像我们在ashx里面使用Response是通过HttpContext对象来调用的,上下文对象一般都是这样的作用(个人理解)。在AreaRegistrationContext类里面的MapRoute方法自动限制了route注册的包含Area Controller的命名空间。这也意味着当我们在area里面创建一个controller时,必须在默认的命名空间里面。否则路由系统会找不到它。
接着我们在area里创建一个controller——HomeController,接着再创建一个View。然后可以运行我们的程序
报错是因为MVC不知道选择哪个controller(HomeController有两个:一个在Area里面,一个在外面),解决的方法前面的笔记里面有提到的,如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },// Parameter defaults
new[] { "WorkingWithAreas.Controllers" }
);
}
在Area里面创建链接时跟前面创建时一样,并没有什么特别的步骤。MVC框架会探测与一个实际的Area的相关的请求,然后会在仅仅为该Area定义的routes中找到一个匹配的来创建输出的链接。
例如:@Html.ActionLink("Click me", "About"),在页面呈现的链接是:<a href="/Admin/Home/About">Click me</a>
如果链接指向的是其他Area里面或者是Area外面的controller里面的一个action方法,我们必须指定Area的名字,如下:
@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" })
呈现为:<a href="/Support/Home">Click me to go to another area</a>
如果我们要创建一个链接,action是不是在Area里面而是在根目录下的,这时可以这样:
@Html.ActionLink("Click me to go to another area", "Index", new { area = "" })
URL架构最佳实践
上面讲了很多关于URL的结构,近年来,对应应用程序URL的设计越来越来受到重视,有一些比较重要的设计严则出现。如果我们遵循这些严则,将会改善应用程序的可用性,兼容性,已经搜索引擎的排名。这些严则如下:
1.让我们的URL干净并且友好。
http://www.amazon.com/Pro-ASP-NET-MVC-3-Framework/dp/1430234040/ref=sr_1_13?s=books&ie=UTF8&qid=1294771153&sr=1-13将这样的URL变成如下:http://www.amazon.com/books/pro-aspnet-mvc3-framework是不是会好很多。
下面是关于URL友好的一些指南:
1)设计URL来描述它的内容而不是实现细节。使用"/Articles/AnnualReport"代替"/Website_v2/CachedContentServer/FromCache/AnnualReport"
2)使用内容标题胜过ID。使用"/Articles/AnnualReport"代替"/Articles/2392",当然如果是必须用的情况可以两个结合,如/Articles/2392/AnnualReport,这个会比单纯用ID输入更多的字符,但是这样有助于搜索引擎的排名。
3)不要使用针对HTML的文件扩展名,如:.aspx or.mvc。但是可以使用特殊的文件类型如:.jpg, .pdf, and .zip。虽然当我们设置合适的MIME类型时,浏览器不会关心文件扩展名,但是人们倾向于PDF文件的扩展名就是.pdf
4)具有层次。如:/Products/Menswear/Shirts/Red。这样访问的人很容易猜到父级的链接。
5)大小写不敏感。asp.net路由系统默认就是这样。
6)避免符号,编码,字符序列。如果我们希望一个单词分开,可以使用“—”如: /my-great-article。下划线是不友好的,URL会编码空格成为奇怪的字符,如“/my+great+article”或是令人讨厌的如“/my%20great%20article”
7)不要改变URL。因为这样做等于丢掉了业务,当我们改变URL时要尽可能的通过301重定向支持过去旧的URL架构。
8)保持一致性。整个应用程序只使用一种URL格式。
2.正确的选择GET和POST
总的原则就是:GET请求应该针对只读的信息检索,POST请求应该任何可能改变应用程序状态的操作。
在标准的承诺条款中:GET针对安全的交互,POST针对不安全的交互。这些约定是W3C制定的。
GET请求是可寻址的——所有的信息包含在URL中,所以这可能使书签或链接指向这些地址。
好了,今天的笔记就到这里。关于URL和路由的这章笔记到这里就结束了。
晚安!
本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2012/02/26/mvcnotes_21.html如需转载请自行联系原作者
张雪飞