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