基础才是重中之重~你是否真正在用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的规范性。