路由系统之URL模式(2) ----定义可选URL片段、定义可变长路由、按命名空间区分控制器优先顺序

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;

前提:路由配置了命名空间且只有一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值