无涯教程-ASP.NET Core - 路由

114 阅读5分钟

现在让无涯教程了解如何将请求路由到不同的控制器。

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

  • MVC中间件将根据URL提供的一些配置信息来做出此决定。

  • 这种方法通常称为基于约定的路由。以下是常规路由的代码段。

routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"); 
  • 在这种方法中,定义了模板,这些模板告诉MVC如何查看URL并找到控制器名称(controller)和动作(action)名称,其中控制器(controller)是C#类,而动作(action)是该类上的公共方法。

在上一章中,在应用程序中创建了一个控制器(HomeController),它是一个C#类,不需要从基类派生或实现接口或具有任何特殊属性,这是一个简单的C#类,名称为HomeController,它包含返回字符串的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 ,使用 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; }

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

} }

在 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并按回车键,您将看到相同的输出。

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

让无涯教程在浏览器中运行该应用程序,一旦应用程序运行,您将看到以下输出。

Output

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

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

如果向网站的根目录发出请求,则MVC不会看到URL的控制器/操作类型,但可以使用这些默认值。

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

Root Of the Website

现在,您将看到来自控制器的响应,还可以转到/home,它将调用默认操作,即index,您还可以转到/home/index。

通过添加另一个类来创建另一个控制器,并将其命名为 AboutController 。

About Controller

添加一些简单的操作方法,这些方法将返回字符串,如以下程序所示。

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,这两个方法将分别仅返回pady number和country名称,让无涯教程保存此文件,并在根URL的末尾指定/about/phone。

Two Action Methods

您可以在上面的屏幕截图中看到pady number。如果指定/about/country ,您也会看到国家名称。

Country Name

如果您转到/about ,它将再次掉入中间件并转到您的应用程序,运行中间件,您将看到以下页面。

About

参考链接

www.learnfk.com/asp.net_cor…