欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年04月07日 09:17:36   作者:暗斷腸  
這篇文章介紹了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.URL生成

MVC應(yīng)用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL鏈接。 IUrlHelper 接口用于生成URL,是MVC與路由之間的基礎(chǔ)部分。在控制器、視圖和視圖組件中,可通過(guò)Url屬性找到IUrlHelper的實(shí)例。在此示例中,將通過(guò)Controller.Url屬性使用IUrlHelper接口來(lái)生成指向另一項(xiàng)操作的URL。

public class HomeController : Controller
{
    public IActionResult Index()
    {
        var url1= Url.Action("Privacy");//Url:Home/Privacy
        var url2 = Url.Action("Error");//Url:Home/Error
        var url3 = Url.Action("Article");//Url:Blog/Article
        var msg = $"url1: {url1}";
        msg += $"\r\nurl2: {url2}";
        msg += $"\r\nurl3: {url3}";
        return Content(msg);
    }
    [HttpGet("custom/url/to/privacy")]//定義一個(gè)路由模版
    public IActionResult Privacy()
    {
        return View();
    }
    public IActionResult Error(string code)
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

響應(yīng)結(jié)果:

如果Url.Action方法都只設(shè)置Action名稱(chēng),那么IUrlHelper接口會(huì)獲取通過(guò)指向當(dāng)前所在控制器里存在的Action操作,然后生成URL。如果當(dāng)前控制器里Action操作自定義路由模版,則會(huì)生成對(duì)應(yīng)路由模版URL。如果Action不存在當(dāng)前控制器里,則會(huì)生成空字符串的URL。

2.URL生成方式

2.1根據(jù)操作名稱(chēng)生成URL

Url.Action (IUrlHelper. Action) 可以通過(guò)指定控制器(Controller)名稱(chēng)和操作(Action)名稱(chēng)來(lái)生成要鏈接的內(nèi)容。而重載方法里還包含添加路由值對(duì)象,比如Url.Action("Home", "Index", new { id = 17 }),此處路由值對(duì)象就是new { id = 17 }(路由值對(duì)象通常是匿名類(lèi)型的對(duì)象)。下面我們通過(guò)示例來(lái)看看:

public class HomeController : Controller
{
    public IActionResult Index(int id)
    {
        var url = Url.Action("Index", "Home", new { id = 17, color = "red", sex = "m" });
        return View();
    }
}

通過(guò)DEBUG查看生成URL:

2.2根據(jù)路由生成URL

上面的代碼演示了如何通過(guò)傳入控制器和操作名稱(chēng)來(lái)生成URL。IUrlHelper還提供 Url.RouteUrl系列的方法。這些方法類(lèi)似于Url.Action,但它們不會(huì)將action和controller的當(dāng)前值復(fù)制到路由值。最常見(jiàn)的用法是指定一個(gè)路由名稱(chēng),以使用特定路由來(lái)生成URL,通常不指定控制器或操作名稱(chēng)。

public class HomeController : Controller
{
    public IActionResult Index(int id)
    {
        var url = Url.RouteUrl("Privacy_Name");
        return View();
    }
    [HttpGet("custom/url/to/privacy",Name = "Privacy_Name")]//定義一個(gè)路由模版
    public IActionResult Privacy()
    {
        return View();
    }
}

通過(guò)DEBUG查看生成URL:

2.3在HTML中生成URL

IHtmlHelper提供HtmlHelper方法Html.BeginForm和Html.ActionLink,可分別生成<form>和 <a>元素。這些方法使用Url.Action方法來(lái)生成URL,并且采用相似的參數(shù)。HtmlHelper的配套Url.RouteUrl為Html.BeginRouteForm和Html.RouteLink,兩者具有相似的功能。

@using (Html.BeginForm("Article", "Blog", FormMethod.Get, new { name = "nForm", id = "idForm" })){}
@Html.ActionLink("Article", "Article", "Blog")

通過(guò)瀏覽器工具查看生成HTML:

2.4在操作結(jié)果中生成URL

以上示例展示了如何在控制器中使用IUrlHelper。不過(guò),控制器中最常見(jiàn)的用法是將URL生成為操作結(jié)果的一部分。ControllerBase和Controller基類(lèi)為操作結(jié)果提供簡(jiǎn)便的方法來(lái)引用另一項(xiàng)操作。一種典型用法是在接受用戶(hù)輸入后進(jìn)行重定向。

public IActionResult Edit(int id, Customer customer)
{
    if (ModelState.IsValid)
    {
        // Update DB with new details.
        return RedirectToAction("Index");
    }
    return View(customer);
}

3.區(qū)域(Area)

區(qū)域是ASP.NET功能,它提供了一種將ASP.NET Core Web應(yīng)用程序劃分為更小的功能組的方法,每個(gè)功能組都有自己的一組Razor Pages、控制器(Controllers)、視圖(Views)和模型(Models)。區(qū)域?qū)嶋H上是應(yīng)用程序內(nèi)的結(jié)構(gòu)。在ASP.NET Core Web項(xiàng)目中,Pages、模型、控制器和視圖等邏輯組件保存在不同的文件夾中。ASP.NET Core運(yùn)行時(shí)使用命名約定來(lái)創(chuàng)建這些組件之間的關(guān)系。對(duì)于大型應(yīng)用程序,將應(yīng)用程序區(qū)分為獨(dú)立的高級(jí)功能區(qū)域可能更有利。例如,具有多個(gè)業(yè)務(wù)單位(如結(jié)賬、計(jì)費(fèi)、搜索等)的電子商務(wù)應(yīng)用程序。每個(gè)單位都有自己的區(qū)域,以包含視圖、控制器、Razor Pages和模型。下面的示例我們根據(jù)采購(gòu)(Purchase)和銷(xiāo)售(Sale)訂單兩個(gè)業(yè)務(wù)場(chǎng)景在MVC中配置使用默認(rèn)傳統(tǒng)路由和區(qū)域路由:

public class Startup
{  
    public void Configure(IApplicationBuilder app)
    {
        app.UseMvc(routes =>
        {
            routes.MapAreaRoute(
                name: "MyAreaPurchase",
                areaName: "Purchase",
                template: "Purchase/{controller}/{action}/{id?}");
            routes.MapAreaRoute(
                name: "MyAreaSale",
                areaName: "Sale",
                template: "Sale/{controller}/{action}/{id?}");
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
            //等價(jià)于
            //routes.MapAreaRoute("purOrder_route", "Purchase",
            //"Purchase/{controller}/{action}/{id?}");
            //routes.MapAreaRoute("saleOrder_route", "Sale",
            //"Sale/{controller}/{action}/{id?}");
            //routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

在上面的示例中,路由值將與以下操作匹配:

[Area("Purchase")]
public class PurOrderController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}
[Area("Sale")]
public class SaleOrderController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

在每個(gè)控制器加入AreaAttribute屬性是表示該控制器是某個(gè)區(qū)域的一部分,比方說(shuō),PurOrderController控制器位于Purchase區(qū)域中,SaleOrderController控制器位于Sale區(qū)域中。 而沒(méi)有 [Area] 屬性的控制器不是任何區(qū)域的成員,在路由提供area路由值時(shí)不匹配時(shí),打開(kāi)對(duì)應(yīng)控制器下的視圖時(shí)將無(wú)法打開(kāi)。在上面的示例中,只有所列出PurOrderController、SaleOrderController控制器下視圖Index的路由值 { area = Purchase, controller = PurOrder, action = Index } 、{ area = Sale, controller = SaleOrder, action = Index }匹配才能打開(kāi)對(duì)應(yīng)鏈接。

4.實(shí)現(xiàn)IActionConstraint的路由約束

實(shí)現(xiàn)IActionConstraint約束最簡(jiǎn)單的方法是創(chuàng)建派生自System.Attribute的類(lèi),并將其置于操作(Action)和控制器(Controller)上。 MVC將自動(dòng)發(fā)現(xiàn)任何應(yīng)用為屬性的IActionConstraint屬性,便對(duì)應(yīng)用程序模型應(yīng)用程序進(jìn)行約束。在下面的示例中,對(duì)路由數(shù)據(jù)中的國(guó)家/地區(qū)選擇操作進(jìn)行約束。

public class CountrySpecificAttribute : Attribute, IActionConstraint
{
    private readonly string _countryCode;
    public CountrySpecificAttribute(string countryCode)
    {
        _countryCode = countryCode;
    }
    public int Order
    {
        get
        {
            return 0;
        }
    }
    public bool Accept(ActionConstraintContext context)
    {
        string routeDataValue = context.RouteContext.RouteData.Values["id"] == null ? "" : context.RouteContext.RouteData.Values["id"].ToString();
        return string.Equals(
            routeDataValue,
            _countryCode,
            StringComparison.OrdinalIgnoreCase);
    }
}
public class HomeController : Controller
{
    [CountrySpecific("en-us")]
    public IActionResult Index(string id)
    {
        return View();
    }
}

根據(jù)官網(wǎng)解釋IActionConstraint.Order是順序約束意思,比如HomeController 控制器上有[CountrySpecific("en-us")]和[HttpGet](或者其他自定義屬性約束)屬性約束,數(shù)值較低的屬性約束先運(yùn)行。響應(yīng)結(jié)果通過(guò)下面表格進(jìn)行分析:

Route Url

Result

[SERVICE_NAME]/Home/Index/en-us

200

[SERVICE_NAME]/Home/Index/zh-cn

404

通過(guò)以上的表格可以知道,在此例中,當(dāng)Index傳入路由值(en-us)匹配時(shí),Accept方法返回true以表示該操作是匹配項(xiàng),然后可以打開(kāi)連接,反之傳入值(zh-cn)不匹配,則404。

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

相關(guān)文章

  • 創(chuàng)建基于ASP.NET的SMTP郵件服務(wù)的具體方法

    創(chuàng)建基于ASP.NET的SMTP郵件服務(wù)的具體方法

    Asp.net在System.Web.Mail名稱(chēng)空間中有一個(gè)發(fā)送email的內(nèi)建類(lèi),但這僅是cdosys的一個(gè)假象。開(kāi)發(fā)者能使用一個(gè)替代的它smtp郵件服務(wù)。在這篇文章里面,我將會(huì)展示如何創(chuàng)建一個(gè)用于asp.net的功能齊全的smtp郵件服務(wù)
    2013-11-11
  • 一文輕松了解ASP.NET與ASP.NET?Core多環(huán)境配置對(duì)比

    一文輕松了解ASP.NET與ASP.NET?Core多環(huán)境配置對(duì)比

    ASP.NET?Core支持在多個(gè)環(huán)境中管理應(yīng)用程序,如開(kāi)發(fā)(Development),預(yù)演(Staging)和生產(chǎn)(Production),下面這篇文章主要給大家介紹了關(guān)于ASP.NET與ASP.NET?Core多環(huán)境配置對(duì)比?的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • ASP.NET編程中的十大技巧

    ASP.NET編程中的十大技巧

    ASP.NET編程中的十大技巧...
    2006-09-09
  • Visual Studio 2015安裝步驟詳解

    Visual Studio 2015安裝步驟詳解

    這篇文章主要為大家詳細(xì)介紹了Visual Studio 2015安裝步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • ASP.Net中的async+await異步編程的實(shí)現(xiàn)

    ASP.Net中的async+await異步編程的實(shí)現(xiàn)

    這篇文章主要介紹了ASP.Net中的async+await異步編程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Coolite Cool Study 3 MVC + Coolite 的實(shí)現(xiàn)代碼

    Coolite Cool Study 3 MVC + Coolite 的實(shí)現(xiàn)代碼

    啊,開(kāi)始以為MVC+Coolite結(jié)合的例子沒(méi)什么難度,但原來(lái)Coolite在MVC中需要特定設(shè)置一下某些屬性才行,費(fèi)了兩個(gè)小時(shí)才算大功告成,具體請(qǐng)看下文。還是先把這個(gè)例子的效果貼上來(lái)再說(shuō)。
    2009-05-05
  • 解決uploadify使用時(shí)session發(fā)生丟失問(wèn)題的方法

    解決uploadify使用時(shí)session發(fā)生丟失問(wèn)題的方法

    這篇文章主要為大家詳細(xì)介紹了uploadify使用時(shí)發(fā)現(xiàn)session發(fā)生丟失問(wèn)題的解決方法,遇到過(guò)類(lèi)似問(wèn)題的朋友可以參考本文進(jìn)行解決
    2016-05-05
  • .NET?Core使用Worker?Service創(chuàng)建服務(wù)

    .NET?Core使用Worker?Service創(chuàng)建服務(wù)

    這篇文章介紹了.NET?Core使用Worker?Service創(chuàng)建服務(wù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • asp.net DropDownList實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)效果

    asp.net DropDownList實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)效果

    這篇文章主要介紹了asp.net DroDownList實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)效果的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • c# NameValueCollection類(lèi)讀取配置信息

    c# NameValueCollection類(lèi)讀取配置信息

    c#中的NameValueCollection類(lèi)讀取配置信息,大家可以參考下。
    2009-04-04

最新評(píng)論