zoukankan      html  css  js  c++  java
  • ASP.NET MVC——URL路由

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

    首先我们来创建一个基础项目用来演示。代码如下:

    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. 创建并注册一条简单的路由

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

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

      我们可以删掉这条路由,手工来创建。例如这样:

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

      我们将URL写为 localhost:端口/Admin/Index,我们可以看到浏览器成功转到了Admin控制器的Index动作方法。

    2.定义默认值

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

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

           现在当URL为根地址时,浏览器会自动导航到我们所定义的默认值。

         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捕获的片段是以“片段/片段/片段”的形式表示的。你需要对这个字符进行处理,把它们分解成一个一个片段。

     

  • 相关阅读:
    Win7安装软件,装到microsoft.vc90.crt时卡住的解决办法
    转:如何利用已有的切片文件生成TPK
    转:ACCESS数据库转ORACLE数据库分享
    转:ITopologicalOperator Buffer调用异常的解决方法(来源网络)
    转:【制图】如何表现道路上下层级间的真实关系
    oracle 递归查询(来源于网络)
    Sde各类命令详解(sdemon 、sdelayer、sdeservice、sdetable、sdeconfig、SdeExport_SdeImport)
    GIS中的坐标系定义与转换
    转:Oracle优化总结
    转:ArcGIS提取面状道路中心线(转载)
  • 原文地址:https://www.cnblogs.com/skyshalo/p/5799615.html
Copyright © 2011-2022 走看看