ASP.NET Core - 路由

在MVC框架中,我们有三个组件,每个组件都专注于作业的特定部分.为了使所有这些工作正常,我们需要找到一种方法将这些HTTP请求发送到正确的控制器.在ASP.NET Core MVC中,此过程称为路由.路由是将HTTP请求定向到控制器的过程.

现在让我们了解如何将请求路由到不同的控制器.

  • ASP.NET Core中间件需要一种方法来确定给定的HTTP请求是否应该转到控制器进行处理.

  • MVC中间件将根据我们提供的URL和一些配置信息做出此决定.在本章中,我们将定义此配置信息,或者当我们添加MVC中间件时,您可以在Startup.cs中说出路由信息.

  • 这种方法经常被引用作为基于约定的路由.以下是传统路由的代码片段.

routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");


  • 在这种方法中,我们定义模板,告诉MVC如何查看URL和查找控制器名称和操作名称,其中控制器是C#类,操作是该类的公共方法.

In最后一章,我们在我们的应用程序中创建了一个控制器(HomeController),它是一个C#类,不需要从基类派生或实现接口或具有任何特殊属性.它是一个带有名称HomeController的普通C#类,它包含一个返回字符串的Index方法.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppdemo.Controllers { 
   public class HomeController { 
      public string Index() { 
         return "Hello, World! this message is from Home Controller..."; 
      } 
   }
}


在这里,我们将重点关注路由到控制器.我们还将尝试了解路由的工作原理.

现在让我们回到 Startup类,我们将MVC中间件配置到我们的应用程序中.在Configure方法中,我们使用了一个方法 UseMvcWithDefaultRoute .

public void Configure(IApplicationBuilder app) { 
   app.UseIISPlatformHandler();  
   
   app.UseDeveloperExceptionPage(); 
   app.UseRuntimeInfoPage();  
   
   app.UseFileServer(); 
   app.UseMvcWithDefaultRoute();  
   
   app.Run(async (context) => { 
      var msg = Configuration["message"]; 
      await context.Response.WriteAsync(msg); 
   });  
}


这为我们提供了一个默认路由规则,允许我们访问 HomeController .我们使用 UseMvc ,而不是使用 UseMvcWithDefaultRoute ,然后使用命名方法 ConfigureRoute 在此时配置路由.以下是Startup.cs文件的实现.

using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Hosting; 
using Microsoft.AspNet.Http; 

using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Configuration; 
using Microsoft.AspNet.Routing; 
using System;  

namespace FirstAppDemo { 
   public class Startup { 
      public Startup() { 
         var builder = new ConfigurationBuilder() .AddJsonFile("AppSettings.json"); 
         Configuration = builder.Build(); 
      }  
      public IConfiguration Configuration { get; set; } 
      
      // This method gets called by the runtime. 
      // Use this method to add services to the container. 
      // For more information on how to configure your application, 
      // visit http://go.microsoft.com/fwlink/?LinkID=398940 
      public void ConfigureServices(IServiceCollection services) { 
         services.AddMvc(); 
      }  
        
      // This method gets called by the runtime.  
      // Use this method to configure the HTTP request pipeline. 
      public void Configure(IApplicationBuilder app) { 
         app.UseIISPlatformHandler();  
         
         app.UseDeveloperExceptionPage(); 
         app.UseRuntimeInfoPage();  
         
         app.UseFileServer(); 
         app.UseMvc(ConfigureRoute);  
         
         app.Run(async (context) => { 
            var msg = Configuration["message"]; 
            await context.Response.WriteAsync(msg); 
         });
      }  
      private void ConfigureRoute(IRouteBuilder routeBuilder) { 
         //Home/Index 
         routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}");
      }  
        
      // Entry point for the application. 
      public static void Main(string[] args) => WebApplication.Run<Startup>(args);
   } 
}


ConfigureRoute 方法中,您可以配置路线;你可以看到这个方法必须采用IRouteBuilder类型的参数.路由的目标是描述ASP.NET Core MVC将用于处理HTTP请求并找到可以响应该请求的控制器的规则.

  • 你可以有一条路线可以将请求映射到不同的控制器.

  • 我们可以告诉我们要映射的routeBuilder新路由及其名称为"Default",然后提供最重要的路由信息,即模板.

  • 模板是一个字符串,它将向ASP.NET Core MVC描述如何拆分URL.

  • 在上一个例子中,我们添加了一个HomeController,所以你也可以请求以下任何URL,它们也将被定向到HomeController上的Index操作.

    • http://localhost:49940

    • http://localhost:49940/Home

    • http://localhost:49940/Home/Index

  • 当浏览器重新发布时sts http://mysite/或http://mysite/Home ,它从HomeController的Index方法返回输出.

  • 您也可以通过更改浏览器中的URL来尝试此操作.在这个例子中,它是 http://localhost:49940/,,除了可能不同的端口.

  • 如果您将/Home或/Home/Index附加到URL并按Enter按钮,您将看到相同的结果.

  • 结尾处的问号ID表示此参数是可选的.换句话说,ASP.NET Core MVC不必在这里看到某种ID,可能是数字,字符串或GUID.

让我们在浏览器中运行应用程序.运行应用程序后,您将看到以下输出.

Output

您可以看到app.Run中间件弹出的消息,我们收到此消息的原因是因为MVC中间件看到了该URL.这是对网站根目录的请求,该网站未在URL中找到控制器名称或操作名称.网站的根目录放弃处理该请求并将请求传递给下一个中间件,即 app.Run 代码.与默认模板不同,我们指定的路径模板是安静的.

在默认模板中,如果找不到控制器和操作名称,则应用一些默认值.如果请求进入网站的根目录,则默认控制器名称将为Home.您可以根据需要将其更改为任何其他控制器,默认操作名称可以是索引.如果需要,您也可以更改默认操作,如以下程序所示.

private void ConfigureRoute(IRouteBuilder routeBuilder) { 
   //Home/Index 
   routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}"); 
}


如果请求进入网站的根目录,MVC看不到控制器/操作类型的URL,但它可以使用这些默认值.

让我们保存Startup.cs文件并将浏览器刷新到网站的根目录.

网站的根目录

您现在将看到来自您的控制器的响应,您还可以访问/home,这将调用默认动作,即索引.您也可以转到/home/index,现在MVC将从URL中提取控制器名称和操作名称.

让我们通过添加另一个类来创建另一个控制器并将其命名为 AboutController .

关于控制器

让我们添加一些简单的动作方法,它们将返回字符串,如下面的程序所示.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppDemo.Controllers  { 
   public class AboutController { 
      public string Phone() { 
         return "+49-333-3333333"; 
      }  
      public string Country() { 
         return "Germany"; 
      } 
   } 
}


在这个控制器中,你可以看到两个动作方法 : 电话和国家/地区,分别只返回电话号码和国家/地区名称.我们稍后会进入花哨的HTML.让我们保存这个文件,并在根URL的末尾指定/about/phone.

2操作方法

您可以在上面的屏幕截图中看到电话号码.如果您指定/about/country ,您也会看到该国家/地区的名称.

国家/地区名称

如果您转到/about ,它将再次通过中间件落入您的app.Run中间件和您将看到以下页面.

关于

在这里, ASP.NET Core MVC转到AboutController,但未找到指定的操作.因此它将默认为Index并且此控制器没有Index方法,然后请求将转到下一个中间件.