mvc 做伪静态另外一个方法
上一篇文章介绍如何做伪静态如下:
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 都可以实现哦,但前提就是必须约定开发。
希望大牛路过的时候 提供更好的方法 ,希望能抛砖引玉!