zoukankan      html  css  js  c++  java
  • MVC涉及RouteTable自定义路径

    Routing

    到目前为止,我们已经解决了MVC的很多问题,但忽略了最基本的最重要的一个问题:当用户发送请求时,会发生什么?

    最好的答案是“执行Action 方法”,但仍存在疑问:对于一个特定的URL请求,如何确定控制器和action 方法。在开始实验31之前,我们首先来解答上述问题,你可能会困惑为什么这个问题会放在最后来讲,因为了解内部结构之前,需要更好的了解MVC。

    理解RouteTable

    在Asp.net mvc中有RouteTable这个概念,是用来存储URL 路径的,简而言之,是保存已定义的应用程序的可能的URL pattern的集合。

    默认情况下,路径是项目模板组成的一部分。可在 Global.asax 文件中检查到,在 Application_Start中会发现以下语句:

       1:  RouteConfig.RegisterRoutes(RouteTable.Routes);

    App_Start文件夹下的 RouteConfig.cs文件,包含以下代码块:

       1:  namespace WebApplication1
       2:  {
       3:      public class RouteConfig
       4:      {
       5:          public static void RegisterRoutes(RouteCollection routes)
       6:          {
       7:              routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
       8:   
       9:              routes.MapRoute(
      10:                  name: "Default",
      11:                  url: "{controller}/{action}/{id}",
      12:                  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      13:              );
      14:          }
      15:      }
      16:  }
     
     

    RegisterRoutes方法已经包含了由routes.MapRoute 方法定义的默认的路径。已定义的路径会在请求周期中确定执行的是正确的控制器和action 方法。如果使用 route.MapRoute创建了多个路径,那么内部路径的定义就意味着创建Route对象。

    MapRoute 方法也可与 RouteHandler 关联。

    理解ASP.NET MVC 请求周期

    在本节中我们只讲解请求周期中重要的知识点

    1.  UrlRoutingModule

    当最终用户发送请求时,会通过UrlRoutingModule 对象传递,UrlRoutingModule 是HTTP 模块。

    2. Routing

    UrlRoutingModule 会从route table集合中获取首次匹配的Route 对象,为了能够匹配成功,请求URL会与route中定义的URL pattern 匹配。

    当匹配的时候必须考虑以下规则:

    • 数字参数的匹配(请求URL和URL pattern中的数字)

    • URL pattern中的可选参数:

    • 参数中定义的静态参数


    3. 创建MVC Route Handler

    一旦Route 对象被选中,UrlRoutingModule会获得 Route对象的 MvcRouteHandler对象。

    4. 创建 RouteData 和 RequestContext

    UrlRoutingModule使用Route对象创建RouteData,可用于创建RequestContext。RouteData封装了路径的信息如Controller名称,action名称以及route参数值。

    Controller 名称

    为了从URL 中获取Controller名称,需要按规则执行如在URL pattern中{Controller}是标识Controller名称的关键字。

    Action Method 名称

    为了获取action 方法名称,{action}是标识action 方法的关键字。

    Route 参数

    URL pattern能够获得以下值:

    1.{controller}

    2.{action}

    3. 字符串,如 “MyCompany/{controller}/{action}”,“MyCompany”是字符串。

    4. 其他,如“{controller}/{action}/{id}”,”id“是路径的参数。

    例如:

    Route pattern - > “{controller}/{action}/{id}”

    请求 URL ->http://localhost:8870/BulkUpload/Upload/5

    测试1

       1:  public class BulkUploadController : Controller
       2:  {
       3:      public ActionResult Upload (string id)
       4:      {
       5:         //value of id will be 5 -> string 5
       6:         ...
       7:      }
       8:  }

    测试2

       1:  public class BulkUploadController : Controller
       2:  {
       3:      public ActionResult Upload (int id)
       4:      {
       5:         //value of id will be 5 -> int 5
       6:         ...
       7:      }
       8:  }

    测试3

       1:  public class BulkUploadController : Controller
       2:  {
       3:      public ActionResult Upload (string MyId)
       4:      {
       5:         //value of MyId will be null
       6:         ...
       7:      }
       8:  }

    5. 创建MVC Handler

    MvcRouteHandler 会创建 MVCHandler的实例传递 RequestContext对象

    6. 创建Controller实例

    MVCHandler会根据 ControllerFactory的帮助创建Controller实例

    7. 执行方法

    MVCHandler调用Controller的执行方法,执行方法是由Controller的基类定义的。

    8. 调用Action 方法

    每个控制器都有与之关联的 ControllerActionInvoker对象。在执行方法中ControllerActionInvoker对象调用正确的action 方法。

    9. 运行结果

    Action方法会接收到用户输入,并准备好响应数据,然后通过返回语句返回执行结果,返回类型可能是ViewResult或其他。

    实验31——实现对用户有好的URL

    1. 重新定义 RegisterRoutes  方法

    RegisterRoutes 方法中包含 additional route

       1:  public static void RegisterRoutes(RouteCollection routes)
       2:  {
       3:      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
       4:   
       5:      routes.MapRoute(
       6:      name: "Upload",
       7:      url: "Employee/BulkUpload",
       8:      defaults: new { controller = "BulkUpload", action = "Index" }
       9:      );
      10:   
      11:      routes.MapRoute(
      12:          name: "Default",
      13:          url: "{controller}/{action}/{id}",
      14:          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      15:      );
      16:  }

    2. 修改URL 引用

    打开“~/Views/Employee”文件下的 AddNewLink.cshtml ,修改BulkUpload 链接,如下:

       1:   
       2:  <a href="/Employee/BulkUpload">BulkUpload</a>

    3. 运行测试

    关于实验31

    之前的URL 现在是否起作用?

    是,仍然有用。BulkUploadController中的Index 方法可通过两个URL 访问。

    1. ”http://localhost:8870/Employee/BulkUpload“

    2. “http://localhost:8870/BulkUpload/Index”

    Route 参数和Query 字符串有什么区别?

    • Query 字符串本身是有大小限制的,而无法定义Route 参数的个数。
    • 无法在Query 字符串值中添加限制,但是可以在Route 参数中添加限制。
    • 可能会设置Route参数的默认值,而Query String不可能有默认值。
    • Query 字符串可使URL 混乱,而Route参数可保持它有条理。

    如何在Route 参数中使用限制?

    可使用正则表达式。

    如:

       1:  routes.MapRoute(
       2:      "MyRoute",
       3:      "Employee/{EmpId}",
       4:      new {controller=" Employee ", action="GetEmployeeById"},
       5:      new { EmpId = @"d+" }
       6:   );

    Action 方法:

       1:  public ActionResult GetEmployeeById(int EmpId)
       2:  {
       3:     ...
       4:  }

    为了保证每个路径参数都能独立,因此参数名称必须与Route Parameter一致。

    是否需要将action 方法中的参数名称与Route 参数名称保持一致?

    Route Pattern 也许会包含一个或多个RouteParameter,为了区分每个参数,必须保证action 方法的参数名称与Route 参数名称相同。

    定义路径的顺序重要吗?

    有影响,在上面的实验中,我们定义了两个路径,一个是自定义的,一个是默认的。默认的是最先定义的,自定义路径是在之后定义的。

    当用户输入“http://.../Employee/BulkUpload”地址后发送请求,UrlRoutingModule会搜索与请求URL 匹配的默认的route pattern ,它会将 Employee作为控制器的名称,“BulkUpload”作为action 方法名称。因此定义的顺序是非常重要的,更常用的路径应放在最后。

    是否有什么简便的方法来定义Action 方法的URL pattern?

    我们可使用基于 routing 的属性。

    1.  基本的routing 属性可用

    在 RegisterRoutes 方法中在 IgnoreRoute语句后输入代码如下:

       1:  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
       2:   
       3:  routes.MapMvcAttributeRoutes();
       4:   
       5:  routes.MapRoute(
       6:  ...

    2. 定义action 方法的 route pattern

       1:  [Route("Employee/List")]
       2:  public ActionResult Index()
       3:  {

    3. 运行测试

    routing 属性可定义route 参数,如下:

       1:  [Route("Employee/List/{id}")]
       2:  publicActionResult Index (string id) { ... }

    IgnoreRoutes 的作用是什么?

    当我们不想使用routing作为特别的扩展时,会使用IgnoreRoutes。作为MVC模板的一部分,在RegisterRoute 方法中下列语句是默认的:

       1:  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    这就是说如果用户发送以“.axd”为结束的请求,将不会有任何路径加载的操作,请求将直接定位到物理资源。

  • 相关阅读:
    linux 查看 服务 命令
    Java Swing中键盘事件的处理(转)
    VI常用命令及快捷键(转)
    Linux source用法(转)
    无线桥接 WDS 中继(转)
    在远程桌面连接中使用任务管理器(转)
    linux 运行 级别(转)
    linux 当前用户 命令 w who(转)
    vecket适合和不适合的10种人(转)
    在查找预编译头使用时跳过解决(转)
  • 原文地址:https://www.cnblogs.com/lvjy-net/p/8462764.html
Copyright © 2011-2022 走看看