《Pro ASP.NET MVC 3 Framework》學習筆記之二十一【Area及URL架構的最佳實踐】


使用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和路由的這章筆記到這里就結束了。
晚安!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM