基礎才是重中之重~你是否真正在用MVC路由功能


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的規范性。


免責聲明!

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



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