猿教程 Logo

Asp.Net Core MVC路由

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

在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#类,操作是该类的公共方法。

在最后一章中,我们在我们的应用程序中创建了一个控制器(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..."; 
      } 
   }
}

   

在这里,我们将重点介绍控制器的路由。 我们还将尝试了解路由的工作原理。

现在让我们回到启动类,我们在我们的应用程序中配置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 的默认路由规则。 不使用UseMvcWithDefaultRoute,让我们使用UseMvc,然后使用命名方法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

  • 当浏览器请求http:// mysite /或http:// mysite / Home时,它会返回HomeController的Index方法的输出。

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

  • 如果将/ Home或/ Home / Index附加到URL中,然后按Enter按钮,您将看到相同的结果。

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

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


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

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

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


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

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


您现在将看到控制器的响应,您还可以转到/ home,它将调用默认操作,即Index。 你也可以访问/ 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"; 
      } 
   } 
}


在此控制器中,您可以看到两种操作方法 - Phone 和Country,它们将分别仅返回电话号码和国家/地区名称。 稍后我们将介绍一些奇怪的HTML。 让我们保存此文件,并在URL的末尾指定/about/ phone。


您可以在上面的屏幕截图中看到电话号码。 如果指定url为/about/country,您将看到该国家的名称。


如果你访问/about,它会再次通过中间件,调用你的app.Run中间件,你会看到下面的页面。


这里,ASP.NET Core MVC转到AboutController,但是没有找到指定的操作。 所以它将操作默认为Index,并且如果此控制器没有Index方法,它会请求将转到下一个中间件。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/ASPNET-CORE/mvc-routing.html