上一篇文章介紹如何做偽靜態如下:
routes.MapRoute(//兩個參數不帶動作 "TwoparameterNoAction", "{controller}/{CurrentID}/{ClassID}.html", new { controller = @"[a-zA-Z]", action = "Index", CurrentID = @"[\d]{0,3}", ClassID =UrlParameter.Optional } );
這樣就能匹配:http://www.163.com/Home/1/2.html 但無法匹配 http://www.163.com/home/1.html 雖然ClassID是可選的 但還是無發匹配
這個時候很多同學都是重寫多個路由來完成,其實不必如此,我們可以利用路由的通配符{*catchall} * 表示多出所有的段落都可以用catchall 來獲取。
既然我們是做偽靜態使URL個更加友好。我們完全可以這樣做:
routes.MapRoute(//兩個參數不帶動作 多余的參數從catchall 獲取 "TwoparameterNoAction", "{controller}/{CurrentID}/{*catchall}", new { controller = @"[a-zA-Z]", action = "Index", CurrentID = @"[\d]{0,3}"} );
http://www.163.com/home/1.html 那CurrentID就等於int.Parse(controlerContext.RouteData.Values["CurrentID"].ToString().Replace(".html",""))
http://www.163.com/home/1/2.html 那CurrentID就等於1而classid 就等於catchall=2.html 我同樣int.Parse(controlerContext.RouteData.Values["catchall"].ToString().Replace(".html",""))
呵呵 這樣,到此大家就知道了這個.HTML 也被當參數來用了,哈哈 同樣實現了“偽靜態”,對於我現在所開發的中小型網站綽綽有余。
那有的同學就會每一個頁面都要獲取參數怎么辦?很簡單嘛,模型綁定下,在需要控制器的動作 傳遞模型就可以。這點 我就不細說了。
那再多的參數我們都不怕了 哈哈,1/2/3/4/5/6/7/8/9.html 都可以實現哦,但前提就是必須約定開發。
希望大牛路過的時候 提供更好的方法 ,希望能拋磚引玉!