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

posted @ 2012-09-18 18:16  张占岭  阅读(3400)  评论(4编辑  收藏  举报