ASP.NET MVC——URL路由

在MVC以前,ASP.NET假设请求的URL与服务器上的文件之间有关联,服务器接受请求,并输出相应的文件。而在引入MVC后,请求是由控制器的动做方法来处理的。为了处理URL,便引入了路由系统。html

首先咱们来建立一个基础项目用来演示。代码以下:浏览器

1     public class HomeController : Controller
2     {
3         public ActionResult Index()
4         {
5             ViewBag.Controller = "Home";
6             ViewBag.Action = "Index";
7             return View("ActionName");
8         }
}
1     public class AdminController : Controller
2     {
3         public ActionResult Index()
4         {
5             ViewBag.Controller = "Admin";
6             ViewBag.Action = "Index";
7             return View("ActionName");
8         }
9     }

有两个controller,它们都返回视图“ActionName”,咱们建立一个Shared文件夹并在其中新建一个”ActionName“视图,代码以下:服务器

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ActionName</title>
</head>
<body>
    <div>The controller is: @ViewBag.Controller</div>
    <div>The action is: @ViewBag.Action</div>
</body>
</html>

1. 建立并注册一条简单的路由url

         路由是在Routefig.cs文件中定义的,咱们打开文件,会看到有一条默认的路由以下:spa

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

  咱们能够删掉这条路由,手工来建立。例如这样:3d

routes.MapRoute("MyRoute", "{controller}/{action}");

  咱们将URL写为 localhost:端口/Admin/Index,咱们能够看到浏览器成功转到了Admin控制器的Index动做方法。code

2.定义默认值htm

  当咱们以前运行程序时,会发现当URL为根地址,会发现出错。实际上是由于它不匹配已经定义的路由。那么咱们修改以前的路由来为其添加默认值。blog

 routes.MapRoute("MyRoute", "{controller}/{action}", new { controller = "Home", action = "Index" });

       如今当URL为根地址时,浏览器会自动导航到咱们所定义的默认值。ip

     3.使用静态URL

       咱们添加这样一条路由。

routes.MapRoute("", "Public/{controller}/{action}", new { controller = "Home", action = "Index" });

       URL就会变成 localhost:端口/Public/Admin/Index。Public片断就是静态的。

      

Tip:这里要提一下,路由的顺序MapRoute方法会把一条路由添加到RouteCollection集合的末尾,即通常是按添加的顺序被运用的。路由系统试图根据最早被定义的路由模式来匹配输入的URL,只有在不匹配时才会继续对下一条路由进行处理,直到找到匹配的一条。

4. 定义自定义片断变量

   咱们除了使用这些内建的片断变量,也能够定义本身的变量,好比,新建如下路由:

 

routes.MapRoute("MyRoute", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "DefaultId"});

 

        而且修改HomeController以下:

 1         public ActionResult Index()
 2         {
 3             ViewBag.Controller = "Home";
 4             ViewBag.Action = "Index";
 5             return View("ActionName");
 6         }
 7         public ActionResult CustomVariable()
 8         {
 9             ViewBag.Controller = "Home";
10             ViewBag.Action = "CustomVariable";
11             ViewBag.CustomVariable = RouteData.Values["id"];
12             return View();
13         }

       添加视图CustomVariable,代码以下:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>CustomVariable</title>
</head>
<body>
    <div>The controller is: @ViewBag.Controller</div>
    <div>The action is: @ViewBag.Action</div>
    <div>The custom variable is: @ViewBag.CustomVariable</div>
</body>
</html>

      启动程序,并导航到/Home/CustomVariable/Hello,ViewBag会接受到这个自定义片断变量的值,并将其传递为视图。

 5. 定义可变路由

    可变路由能够以一个单一的路由,对任意长度的URL进行路由。经过一个叫作“全匹配”的片断变量,并以“*”做为其前缀,即可以定义对可变片断数的支持。代码清单以下:

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

          这条路由将匹配任何URL,不管URL包含多少片断数,前三个片断分别用于设置controller、action、id变量的值,若是URL含有更多片断,则它们所有赋给catchall变量。注意,由catchall捕获的片断是以“片断/片断/片断”的形式表示的。你须要对这个字符进行处理,把它们分解成一个一个片断。

相关文章
相关标签/搜索