ASP.NET MVC 自定义路由中几个须要注意的小细节

本文主要记录在ASP.NET MVC自定义路由时,一个须要注意的参数设置小细节。 举例来讲,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定义格式的路由时,有几点要注意:框架

一、arg1/arg2/arg3 的部分应该在 routes.MapRoute 中设置默认值UrlParameter.Optional,才容许同时访问只传部分值好比 只传 arg1,或者 arg1/arg2 这样的路径url

二、在设置默认值的状况下,若是出现 http://localhost/Home/About/arg1//arg3 这样的连接,到底arg2是否有传值进来?spa

三、对于http://localhost/Home/ShowAbout/11?arg1=1&arg2=2&arg3=333 这样的连接,到底 arg1取的是1仍是11?code

如下为路由配置的代码,并无为test1和test2设置参数默认值blog

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "ShowAbout",
                url: "Home/ShowAbout/{arg1}/{arg2}/{arg3}",
                defaults: new { controller = "Home", action = "ShowAbout", arg1 = UrlParameter.Optional}
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

 如下为HomeController中的相关代码路由

public JsonResult ShowAbout(string arg1, string arg2, string arg3) {
            return Json(arg1 + "," + arg2 + "," + arg3, JsonRequestBehavior.AllowGet);
        }

当咱们访问连接 http://localhost/Home/ShowAbout/arg1/arg2/arg3 时,会出现以下结果:字符串

"arg1,arg2,arg3"

但若是少了一个参数,好比访问 http://localhost/Home/ShowAbout/arg1/arg2 ,则会出现 404 的错误get

这种状况下,须要在RouteConfig中配置默认值string

routes.MapRoute(
                name: "ShowAbout",
                url: "Home/ShowAbout/{arg1}/{arg2}/{arg3}",
                defaults: new {
                    controller = "Home",
                    action = "ShowAbout",
                    arg1 = UrlParameter.Optional,
                    arg2 = UrlParameter.Optional,
                    arg3 = UrlParameter.Optional
                }
            );

UrlParameter.Optional解决了无论参数是值类型仍是引用类型,在未传对应参数的状况下,都会提供一个默认值(如0或者null)io

这个时候再访问连接 http://localhost/Home/ShowAbout/arg1/arg2  ,则会出现以下结果,而不会报错

"arg1,arg2,"

当咱们传入http://localhost/Home/ShowAbout/arg1//arg3,也就是故意不传arg2的值的时候,会发现结果是

"arg1,arg3,"

也就是arg3实际传给了参数arg2的位置,两个//仍是三个///都会被忽略成一个 /

当咱们访问 http://localhost/Home/ShowAbout/11?arg1=1&arg2=2&arg3=333 这样的连接时候,发现结果是:

"11,2,333"

即当Action方法的参数是Binding类型的时候, MVC框架会将路由参数优先于查询字符串值

相关文章
相关标签/搜索