1.可选URL片段
是指,用户不需要指定,但又不指定默认值的片段。
routes.MapRoute(
name:"MyRoute",
url: "{controller}/{action}/{id}",
defaults:new { controller="User", action="Login",id=UrlParameter.Optional},
namespaces:new string[] { "MVC_Project3.Controllers" }
);
这条路由将匹配不管是否提供id的URL,当未为可选片段变量提供值时,对应的参数值将为null。
Controller中的Action方法:
public ActionResult CustomVariable()
{
ViewBag.Controller = "User";
ViewBag.Action = "CustomVariable";
ViewBag.CustomVariable = (RouteData.Values["id"] ==null)?"<no value>": RouteData.Values["id"];
return View();
}
2.定义可变长路由:
可以接收可变数目的URL片段,能够以一个单一的路由,对任意长度的URL进行路由。通过指定一个叫做"全匹配"的片段变量,并以星号(*)作为其前缀,便可以定义对可变片段数的支持。
routes.MapRoute(
name: "MyRoute",
url: "{controller}/{action}/{*parameter}",
defaults: new { controller = "User", action = "Login" },
namespaces: new string[] { "MVC_Project3.Controllers" }
);
分析:
这条路由将匹配任何URL,无论URL包含多少片段数,也不管这些片段的值是什么。
现在在其他View页面上,放一个超链接,跳转到CustomVariable页面,并采用路由传参的方式:
Codes:
站内跳转:/ControllerName/ActionMethodName/param1/param2/…
<a href="/User/CustomVariable/25/89/26">自定义参数片段</a>
在后台Controller控制器中的Action动作方法,获取可变参数匹配到的值:
string parameter = RouteData.Values["parameter"].ToString();
Result:
这个路由中的URL模式所匹配的片段数没有上限。由parameter所捕获的片段是以"片段/片段/…"的形式表示的,可以使用分割字符串,获取每一个路由参数。
监视:
3.按命名空间区分控制器优先顺序
在一个MVC项目中,如果有两个或多个名字相同的Controller控制器(如:“UserController”),且位于不同的命名空间下,MVC框架不知道该匹配哪一个,将引发报错:
解决方案:
可以告诉MVC框架,在试图解析控制器类名时,对某些命名空间优先处理.
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "MVC_Project3.Controllers" }//给该路由配置命名空间
);
先去MVC_Project3.Controllers命名空间下,去查找控制器.
如果在这个命名空间下没有找到合适的控制器,那么MVC框架会默认回到正常行为,并考查所有可用的命名空间。
已正常显示:
添加到一条路由的命名空间具有同等的优先级,不会按照顺序进行查找(被同等对待)。
namespaces: new string[] { "MVC_Project3.Controllers", "MVC_Project3.Areas.Admin.Controllers" }//给该路由配置命名空间
运行程序,会引发同样的报错。
这种情况需要创建多条路由.
解决方案:
如果希望对某一个命名空间下的控制器给予优先,但又要解析另一个命名空间下的所有其他控制器,就需要创建多条路由。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "MVC_Project3.Controllers" }//给该路由配置命名空间
);
routes.MapRoute(
name: "Default2",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "MVC_Project3.Areas.Admin.Controllers" }//给该路由配置命名空间
);
只在指定的命名空间下查找,如果找不到匹配的控制器,那么框架将不会搜素其他地方。
Route myRoute= routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "MVC_Project3.Controllers" }//给该路由配置命名空间
);
//禁止搜素其他命名空间下的控制器
myRoute.DataTokens["UseNamespaceFallback"] = false;
前提:路由配置了命名空间且只有一个