1:簡單路由
建立MVC的時候會給我們建立預設的路由,如下:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
表示假設你在浏覽器的位址欄輸入了下面的URL:
/Home/Index/3
預設的路由将這個URL映射為下面的參數:
Controller = Home
Action = Index
id = 3
當你請求URL /Home/Index/3時,将會執行下面的代碼:
HomeController.Index(3)
Default路由包含了所有三個參數的預設值。如果你不提供控制器,那麼控制器參數預設值為Home。如果你不提供動作,動作參數預設為值Index。最後,如果你不提供id,id參數預設為空字元串。
2:建立一個自定義路由
routes.MapRoute(
"RouteTemp", // Route name
"Archive/{entryDate}", // URL with parameters
new { controller = "Archive", action = "Entry" } // Parameter defaults
);
上面的代碼意味着我們讓路由比對到
http://localhost:52588/Archive/1911-1-1這樣的URL。
3:下面是設計URL路由的原則
3.1 建立簡單清晰的URL
在WEB-FORM中可能得到這樣的URL:
events_by_month.aspx/year=2008&month=4
這樣的URL沒有如下的URL好:
events/2008/04
這也叫永久URL,同樣,這也辨別了我們可以為路由動作建立多個參數。
3.2 建立可程式設計的URL
這表示删除04,能夠得到2008年的所有記錄是合理的。
3.3 允許URL參數沖突
應該能同時允許
和
events/someeventsname
3.4 避免暴露資料庫ID
events/17
這樣的URL可能暴露了資料庫ID,應該做簡單的處理,如
events/ID17
這也會比第一個URL要好。
3.5 考慮SEO
可以在路由中加入關鍵字,如
events/ID17/MVC
3.6 提供CATCH ALL路由
必須為所有未比對的路由添加的控制器,如下:
routes.MapRoute(
"catch-all",
"{*catchall}",
new { controller = "Error", action = "NotFound" }
);
經過上面的處理,所有未處理的URL,都會交給ErrorController的NotFound處理,如下:
public class ErrorController : Controller
{
public string NotFound()
{
return "not found!";
}
}
3.7 注意路由的次序
路由比對有先後次序,在3.6中,我們會發現,如果輸入
http://localhost:52588/xx,結果IE顯示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZlBnauUmNkZzMmZGZiJjN4QmMiJGMiJmZmZjZiF2N5MmMjlDZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.jpeg)
檢視我們的路由設定:
發現,因為URL
,被路由Default路由走了。将這個預設的路由去掉,一切就OK了。
4:路由限制
有的時候,我們需要,如下的URL
http://localhost:52588/Product/17,
被路由到一個處理ID的控制器,而
http://localhost:52588/Product/Rice則被路由到一個處理商品名稱的控制器,這就需要我們建立路由限制。如下:
routes.MapRoute(
"Product",
"Product/{productId}",
new { controller = "Product", action = "Details" },
new { productId = @"\d+" }
);
routes.MapRoute(
"Product2",
"Product/{entryArg}",
new { controller = "Archive", action = "Entry" }
);
可以看到,前者我們路由到控制器ProductController,而後者則路由到了ArchiveController。
再次強調一遍,在整個項目開始以前,設計好路由是很重要的一個環節。
注意,可以使用實作IRouteConstraint接口來建立自定義路由限制,但是更建議使用像上面這樣的正則比對。
5:Views和Controllers檔案夾
這兩個檔案夾已經成為MVC的預設檔案夾,如果我們想建立頁面不受MVC控制,則需要建立另外的檔案夾。
本文基于
Creative Commons Attribution 2.5 China Mainland License釋出,歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名
http://www.cnblogs.com/luminji(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。