亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

ASP.NET?Core中MVC模式實(shí)現(xiàn)路由一

 更新時(shí)間:2022年04月07日 09:17:08   作者:暗斷腸  
這篇文章介紹了ASP.NET?Core中MVC模式實(shí)現(xiàn)路由的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

相關(guān)文章

ASP.NET Core中MVC模式實(shí)現(xiàn)路由一

ASP.NET Core中MVC模式實(shí)現(xiàn)路由二

1.前言

ASP.NET Core MVC使用路由中間件來(lái)匹配傳入請(qǐng)求的URL并將它們映射到操作(Action方法)。路由在啟動(dòng)代碼(Startup.Configure方法)或?qū)傩裕–ontroller Action屬性)中定義。路由描述應(yīng)如何將URL路徑與操作(Action方法)相匹配。它還用于在響應(yīng)中生成送出的URL。
路由操作可以設(shè)置中間件,支持傳統(tǒng)路由、屬性理由(通過(guò)在Controller Action上放置理由可實(shí)現(xiàn))、多個(gè)路由。

2.設(shè)置路由中間件

在Configure方法中,可能會(huì)看到與下面類似的設(shè)置路由中間件代碼:

app.UseMvc(routes =>
{
    routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});

等價(jià)于

//默認(rèn)模版就是 "{controller=Home}/{action=Index}/{id?}"
app.UseMvcWithDefaultRoute();

在UseMvc的匿名方法中,MapRoute表示創(chuàng)建單個(gè)路由,指定為默認(rèn)(default)路由、路由模版“{controller=Home}/{action=Index}/{id?}”。
路由模版“{controller=Home}/{action=Index}/{id?}”的意思是可以匹配“/Home/Index/5”的URL路徑。也就是說(shuō):

  • {controller=Home}將Home定義為默認(rèn)controller。
  • {action=Index}將Index定義為默認(rèn)action。
  • {id?}將id定義為可選參數(shù)。

UseMvc和UseMvcWithDefaultRoute可向中間件管道添加RouterMiddleware的實(shí)例。MVC不直接與中間件交互,而是使用路由來(lái)處理請(qǐng)求。MVC通過(guò)MvcRouteHandler實(shí)例連接到路由。 重載UseMvc(Action<IRouteBuilder>) 則允許用戶添加自己的路由,并且還支持屬性路由。UseMvcWithDefaultRoute定義默認(rèn)路由并支持屬性路由。

3.傳統(tǒng)路由

默認(rèn)路由:
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
上述代碼就是一個(gè)傳統(tǒng)路由,將這種方式稱為傳統(tǒng)路由的原因在于,它為URL路徑設(shè)立了一個(gè)約定:

  • 第一個(gè)路徑段映射到控制器名稱
  • 第二段映射到操作名稱。
  • 第三段用于可選id(用于映射到模型實(shí)體)。

使用此default路由時(shí),URL路徑/Home/Index映射到HomeController.Index。此映射僅基于控制器和操作(action)名稱,而不基于命名空間、源文件位置或方法參數(shù)。

4.多個(gè)路由

4.1定義多個(gè)路由

通過(guò)對(duì)UseMvc匿名方法添加多個(gè)路由,這樣做可以定義多個(gè)約定或添加專用于特定操作的傳統(tǒng)路由,比如:

app.UseMvc(routes =>
{
    //第一個(gè)路由
    routes.MapRoute("blog", "blog/{*article}",defaults: new { controller = "Blog", action = "Article" });
    //第二個(gè)路由
    routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

第一個(gè)路由里{*article}是表示使用catch-all路由參數(shù)來(lái)捕獲URL路徑的剩余部分。下面我們通過(guò)測(cè)試來(lái)驗(yàn)證下:

●"blog/{*article}":

●"blog/{article}":

通過(guò)上述測(cè)試可以知道,加星號(hào)的路由在傳參字符串中加了斜杠依然能夠打開,沒(méi)加星號(hào)的路由在傳參字符串中加了斜杠就不能打開了。還有一點(diǎn)要注意的是controller.action接收參數(shù)必須跟*后面參數(shù)名稱一致,不然會(huì)接收不到參數(shù)值。

4.2區(qū)分操作

當(dāng)controller存在兩個(gè)action名稱一致的方法,MVC必須要進(jìn)行區(qū)分,不然會(huì)引發(fā)異常,例如:

public class BlogController : Controller
{
    public IActionResult Edit(int id) {}
    [HttpPost]
    public IActionResult Edit(int id, Blog blog) {}
}

當(dāng)請(qǐng)求為HTTP POST時(shí)MVC會(huì)選擇Edit(int, Blog),在Http屬性為任何其他內(nèi)容時(shí)選擇 Edit(int)。如果匹配多個(gè)路由,而MVC找不到“最佳”路由Action時(shí),則會(huì)引發(fā) AmbiguousActionException異常。

5.屬性路由

5.1 屬性路由

屬性路由使用一組屬性將操作(Action)直接映射到路由模板。 在下面的示例中,Configure 方法使用app.UseMvc(),不傳遞任何路由。HomeController將匹配一組URL,這組URL與默認(rèn)路由{controller=Home}/{action=Index}/{id?}匹配的URL類似:

public class HomeController : Controller
{
   [Route("")]
   [Route("Home")]
   [Route("Home/Index")]
   public IActionResult Index()
   {
      return View();
   }
}

下面我們通過(guò)表格來(lái)看看每個(gè)屬性路由在瀏覽器上打開鏈接是怎樣的效果。

Route Template

Browser

Page

Route("")

[SERVICE_NAME]

[SERVICE_NAME]/Home/Index

Route("Home")

[SERVICE_NAME]/Home

Route("Home/Index")

[SERVICE_NAME]/Home/Index

 三種屬性路由在瀏覽器上打開鏈接方式都不一樣,但是呈現(xiàn)頁(yè)面是一樣的,也就是說(shuō)三個(gè)屬性路由的定義方式都是指向同一個(gè)/Home/Index頁(yè)面。到這里或許大伙會(huì)有疑問(wèn),如果我把三個(gè)屬性路由模版名稱都改變下,那會(huì)能打開同一個(gè)頁(yè)面么?

[Route("1")]
[Route("Home1")]
[Route("Home1/Index1")]

上述模版名稱更改了,但是在瀏覽器呈現(xiàn)頁(yè)面還是指向/Home/Index的,也就是說(shuō),無(wú)論屬性路由模版名稱如何更改總能打開對(duì)應(yīng)/Home/Index頁(yè)面。

5.2 使用 Http[Verb] 屬性的屬性路由

屬性路由還可以使用Http[Verb]屬性,比如HttpPostAttribute。所有這些屬性都可采用路由模板。此示例展示與同一路由模板匹配的兩項(xiàng)操作:

public class BlogController : Controller
{
    [HttpGet("/article/{id}", Name = "Article_List")]
    public IActionResult Article(string id)
    {
        return View();
    }
}

當(dāng)我們?cè)跒g覽器上輸入[SERVICE_NAME]/article/1時(shí)候,通過(guò)DEBUG我們可以看到響應(yīng)結(jié)果:

通過(guò)響應(yīng)結(jié)果可以知道屬性路由首先將URL與路由屬性定義的路由模板集([HttpGet("/article/{id}", Name = "Article_List")])進(jìn)行匹配。一旦某個(gè)路由模板匹配,就會(huì)應(yīng)用IActionConstraint約束來(lái)確定可以執(zhí)行的操作。

5.3合并路由

根據(jù)業(yè)務(wù)場(chǎng)景如果我們需要將某個(gè)Controller重新命名為以便訪問(wèn)該Controller下面所有action,那么該如何設(shè)置呢?下面通過(guò)示例來(lái)演示下:

[Route("homes")]
public class HomeController : Controller
{
    [HttpGet("{id}")]
    public IActionResult Index()
    {
       return View();
    }
}

根據(jù)上述代碼,在HomeController上放置路由屬性([Route("homes")])會(huì)使控制器中的所有操作(Action)都使用該屬性路由。也就是說(shuō)只有URL HTTPGet :[SERVICE_NAME]/homes/1才能訪問(wèn)Index視圖。這種做法好處是,HomeController下的每個(gè)Action操作不用單獨(dú)添加Route("homes")屬性,只需要在HomeController外放置一個(gè)全局Route("homes")屬性即可應(yīng)用到每個(gè)Action去,減少路由屬性重復(fù)。

5.4指定屬性路由的可選參數(shù)、默認(rèn)值和約束

屬性路由同時(shí)也支持使用與傳統(tǒng)路由相同的內(nèi)聯(lián)語(yǔ)法,來(lái)指定可選參數(shù)、默認(rèn)值和約束。下面請(qǐng)看示例:

public class HomeController : Controller
{
    [HttpGet("homes/{id:int}")]
    public IActionResult Index(int id)
    {
        return View();
    }
}

上述代碼執(zhí)行結(jié)果我們通過(guò)表格來(lái)看看效果:

Browser

Result status

[SERVICE_NAME]/homes/1

200

[SERVICE_NAME]/homes/qwe

404

[HttpGet("homes/{id:int}")]把傳入id參數(shù)值約束為只有數(shù)字才能打開該屬性下視圖,如果傳入是字符串則無(wú)法找到該視圖。而更多路由約束模板在這里參閱。

5.4自定義屬性路由

我們可以通過(guò)框架自帶的IRouteTemplateProvider接口自定義路由屬性(例如類似[HttpGet]、[Route("homes")]等屬性)。當(dāng)應(yīng)用程序啟動(dòng)時(shí),MVC會(huì)查找控制器類和操作方法上的屬性,并使用實(shí)現(xiàn)IRouteTemplateProvider的屬性生成一組初始路由。此部分通過(guò)一個(gè)簡(jiǎn)單的示例說(shuō)明了如何使用應(yīng)用程序自定義屬性路由:

public class MyControllerAttribute : Attribute, IRouteTemplateProvider
{
    //實(shí)現(xiàn)接口的三個(gè)屬性,這里的[controller]是一個(gè)標(biāo)記替換。
    public string Template => "api/[controller]/{action}/{id?}";
    public int? Order { get; set; }
    public string Name { get; set; }
}

新建一個(gè)路由屬性類自定義屬性路徑,然后在Controller或者Action上放置自定義屬性路由。

public class BlogController : Controller
{
    [MyController()]
    public IActionResult Article(string id)
    {
        return View();
    }
}

通過(guò)執(zhí)行[SERVICE_NAME]/api/Blog/Article/1鏈接時(shí)訪問(wèn)成功,也就是說(shuō)自定義屬性路由成功。

到此這篇關(guān)于ASP.NET Core中MVC模式實(shí)現(xiàn)路由的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論