MVC開發環境為我們提供簡單的,友好的,方便的,路由功能,我們可以通過global.asax對它進行URL路由的設置,它會幫助我們自己檢索你controller下的action,它會根據你
action的方法簽名來進行路由重寫的“匹配工作”,而且它的匹配是自上而下的,即第一個滿足路由時,即重寫URL。
實例:我們希望得到的URL地址是這樣的:
怎么去實現?
你可以會說,傳個string的變量就可以了,這和原來的WEB FORM沒有什么區別呀,如果你是這樣實現的,那我要告訴你,你根據就沒有用MVC的路由功能,正確的做法是
在global.ascx中設置你的路由規則
1 routes.MapRoute( 2 "myroute", 3 "{controller}/{action}/{grade}-{subject}-{version}", 4 new { controller = "Home", action = "About", grade = 0, subject = 0, version = 0 } 5 );
注意,要把特殊的規則放在最上面,否則它有可能會被其它規則代替。
然后就是你的action的方法簽名了,要來你的路由匹配,這當然很正常
1 public ActionResult About(int? grade, int? subject, int? version) 2 { 3 ViewBag.query = string.Format("grade:{0},subject:{1},verson{2}", grade, subject, version); 4 return View(); 5 }
最后,我們在URL上輸入測試地址,結果如下:
如果,你希望為這個頁面添加鏈接,請使用MVC的HtmlHelper的擴展方法,不要用<a>標簽了,如果非要用<a>,那你的href需要使用Url.Action來設置地址,這樣才能被MVC路由匹配上。
1 @Html.ActionLink("一年級語文人教版", "About", new { grade = 1, subject = 1, version = 1 }) 2 @Html.ActionLink("二年級數學人教版", "About", new { grade = 2, subject = 2, version = 1 })
當然,如果你的參數只能出現數字,你也可以對它進行約束,像這樣:
1 routes.MapRoute( 2 "Default", // 路由名稱 3 "{controller}/{action}/{id}", // 帶有參數的 URL 4 new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 參數默認值 5 new { grade = @"^\d+$", subject = @"^\d+$", version = @"^\d+$" } 6 );
如果用戶輸入非數字的參數,即當它不匹配規則時,它將無法把被重寫的參數帶到action中,這是正常的,除非你用?grade=a這種格式,當然用這個就與URL重寫沒有關系了,因為它是通過
HTTP請求獲得的數據,我們今天主要說的是URL重寫,即URL的規范性。