MVC 路由 概述

设置URL路由

URL路径中,大括号{}内部的代表参数。/作为分割符,不再大括号内的则作为常量。值得注意的是,{controller}和{action}作为2个关键字由MVC路由控制,如果确实需要用这个名字命名参数,可以在前面加上@,例如{@action}。

默认的设置路由在Global.asax文件中

public static void RegisterRoutes(RouteCollection routes)方法

routes.MapRoute(

                "Default", // Route name

                "{controller}/{action}/{id}", // URL with parameters

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

            );

new { controller = "Home", action = "Index", id = UrlParameter.Optional }是MapRoute中的默认值,意思就是什么都不输入的时候,controller的值和action的值也是必须有值的。

controller代表控制器,action代表这个控制器中的方法。必须要指定默认的controller和action,不然会报错。

 routes.MapRoute(

                "Default", // Route name

                "{controller}/{action}/{id}", // URL with parameters

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

            );

实际上是以下方法的一种简写形式:

Route myRoute = new Route("{controller}/{action}/{id}", new MvcRouteHandler())

{

Defaults = new RouteValueDictionary( new {

controller = "Home", action = "Index", id = UrlParameter.Optional

})

};

routes.Add("Default", myRoute);

路由的顺序也是十分重要,URL被一次匹配每个路由模式,一旦匹配成功,就不再继续匹配下去。这点要注意。例如:

routes.MapRoute(

"Default", // Route name

"{controller}/{action}/{id}", // URL with parameters

new { controller = "Home", action = "Index", // Parameter defaults

id = UrlParameter.Optional }

);

routes.MapRoute(

"Specials", // Route name

"DailySpecials/{date}", // URL with parameters

new { controller = "Catalog", action = "ShowSpecials" } // Parameter defaults

);

这里的Specials将不会被匹配到。

URL路由匹配的时候只匹配路径部分,域名和QueryString不会被匹配到。

路由约束

可以使用正则表达式对参数进行验证约束

routes.Add(new Route("Articles/{id}", new MvcRouteHandler())

{

Defaults = new RouteValueDictionary(

new { controller = "Articles", action = "Show" }

),

Constraints = new RouteValueDictionary(new { id = @"\d{1,6}",id22=@"\d{1,6}" })

});

上面部分可以简写为如下代码:

routes.MapRoute(null, "Articles/{id}",

new { controller = "Articles", action = "Show" },

new { id = @"\d{1,6}",id22=@"\d{1,6}" }

);

不定长度的路径

使用*号匹配不定长度。

 

routes.MapRoute(null, "Articles/{*articlePath}",

new { controller = "Articles", action = "Show" }

);

可以匹配/Articles/Science/Paleontology/Dinosaurs/Stegosaurus

 

匹配硬盘上的文件

尽管设置了路由,但是如果在一些特殊的情况下,硬盘上真实存在的文件和路由的URL一致,这时系统会处理硬盘真实存在的文件,而无视路由的存在。

要解决这个问题,使得无论是否匹配了真实存在的文件,都按照路由的URL来处理,应该在Application_Start()中如下写: 

protected void Application_Start()

        {

            AreaRegistration.RegisterAllAreas();

            RouteTable.Routes.RouteExistingFiles = true;

            RegisterRoutes(RouteTable.Routes);

        }

RouteTable.Routes.RouteExistingFiles默认是false。

这样设置了,就算文件真实存在都会按照路由的方式处理。除了下面2种情况:

1.没有任何匹配的路由。则仍然按照真实文件处理。

2.使用了IgnoreRoute(),无视了一些路由。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值