溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET Core中怎么給路由規(guī)則命名

發(fā)布時(shí)間:2021-07-15 14:24:45 來(lái)源:億速云 閱讀:322 作者:Leah 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)ASP.NET Core中怎么給路由規(guī)則命名,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

比如,放到 /Views 下。

Views(目錄)
    │  _ViewImports.cshtml
    │  _ViewStart.cshtml
    │  
    └─Home(目錄,Controller的名字)
            Index.cshtml(視圖,Action)

其中,Home 是子目錄,對(duì)應(yīng)著控制器 Home,Home 中的 Index.cshtml 視圖對(duì)應(yīng)著 Action 名 Index。此時(shí),_ViewStart 和 _ViewImports 中的內(nèi)容會(huì)應(yīng)用到 /Views 下的所有視圖中(如 Index.cshtml)。

要是改為這樣。

Views

    ├─Home

    │      About.cshtml

    │      Index.cshtml

    │      _ViewImports.cshtml

    │      _ViewStart.cshtml

    │      

    └─Users

            AddNew.cshtml

此時(shí),Views 有兩個(gè)子目錄,Home 是一個(gè)控制器,Users 是另一個(gè)控制器,這時(shí)候,_ViewStart 和 _ViewImports 只對(duì) Home 下面的視圖起作用,對(duì) Users 目錄下的視圖是不起作用的。

_ViewStart 主要用途是在所有視圖文件執(zhí)行之前執(zhí)行,一般我們用它來(lái)設(shè)置 Layout 屬性,以指定使用的布局頁(yè)(相當(dāng)于頁(yè)面母板),這樣一來(lái),我們不需要在每個(gè)視圖上都加 Layout = "xxxx" 了。_ViewImports 主要是用來(lái)引入要用到的命名空間(就是 C# 中的 using),這樣你不需要在每個(gè)視圖中寫一堆 @using Razor 標(biāo)記了。

這兩個(gè)文件都是約定式的,所以你不應(yīng)該隨便改它的名字,_ViewImports 可以通過(guò) RazorTemplateEngineOptions 類的 ImportsFileName 屬性來(lái)修改,不過(guò),_ViewStart 好像不能改,老周看到 asp.net core 源碼中是寫死了的,估計(jì)是不能改文件名的。

其實(shí),這兩個(gè)文件不應(yīng)該改名,而且你改了名字也沒(méi)啥用,反正功能是不變的,還是遵守約定好一些,這樣人家看你的項(xiàng)目時(shí)也看得懂。_Layout.cshtml 文件如非必要,也不應(yīng)該改名字,如果你的應(yīng)用要用多個(gè)布局視圖,可能建個(gè)子目錄,然后每個(gè)子目錄下放_(tái)Layout,這樣結(jié)構(gòu)清晰一些,畢竟,看到 _Layout.cshtml 就明白它是母板頁(yè)了。

規(guī)則模板

我們都知道,在 Startup.Configure 方法中,會(huì)以此方式來(lái)指定 URL 路徑規(guī)則。

app.UseMvc(route =>
            {
                route.MapRoute("main", "{controller=Students}/{action=List}/{sid?}");
                route.MapRoute("edit_post", "{controller}-{action}");
            });

你可以添加 K 條規(guī)則,比如上面的例子,我添加了兩條規(guī)則。

{controller} 和 {action} 是約定的名稱,用來(lái)識(shí)別 Controller 和 Action ,所以你不要自作聰明亂來(lái),必要有些寫死了的參數(shù)才能進(jìn)行 URL 分析,不然,你給個(gè) URL http://dog.org/shopping/pay/500,那應(yīng)用程序根本不知道哪一段是表示 Controller,哪一段是表示 action。

如果確定了 controller 和 action 這兩個(gè)值,那么其他的參數(shù)就好分析了。

其他參數(shù)如果是可選的,可以在后面加個(gè)問(wèn)號(hào),比如 {controller}/{action}/{id?},這表示 id 的值是可選的。

上面老周添加的兩個(gè)規(guī)則中,edit_post 那個(gè)其實(shí)不太規(guī)范,URL 中各段最好用 “/” 來(lái)分隔,因?yàn)?“-” 有時(shí)候是不允許用的,比如,id 參數(shù)前面就不能用,你不能寫成 {controller}-{action}-{id?},要是 id 中包含了字符“-”,咋辦呢?而“/”則不同,URL Encode 后不會(huì)冒出這個(gè)字符來(lái)。

所以用 / 最好,這里用 - 只是老周故意用來(lái)演示而已,URL 嘛,沒(méi)必要玩花樣,沒(méi)意義。

基于 Attribute 指定的 URL 路由

在 Startup.Configure 方法中指定的 URL 路由是作用于整個(gè)應(yīng)用程序的,如果想為個(gè)別控制器或個(gè)別 Action 指定路由規(guī)則,那么可以考慮使用 Attribute 的形式。

attribute 形式的路由規(guī)則和應(yīng)用程序級(jí)別的規(guī)則相似,只是,在應(yīng)用級(jí)別時(shí),用大括號(hào)來(lái)包裹參數(shù)名(如 {controller}),而在 Attribute 方案中,是用中括號(hào)的,它只能用兩個(gè)值:[controller]、[action]。其他參數(shù)也是用大括號(hào)。比如,[controlloer]/[action]/[id?] 會(huì)報(bào)錯(cuò),你得改為 [controller]/[action]/{id?}。

RouteAttribute 既可以用于 Controller 類型,也可能用于單個(gè) Action 方法上。我舉個(gè)例子,像這樣。

[Route("hello/[controller]/[action]")]

    public class SomethingController : Controller

    {

        [Route("{name?}")]

        public IActionResult SayHi(string name)

        {

            ……

        }

    }

在類上應(yīng)用用的 Attribute 中,可以使用這樣的 URL :http://localhost:999/hello/something/sayhi 。而在 SayHi 方法上,又用了 Route Attribute,指定了一個(gè)附加參數(shù) name,并且是可選的。于是它可以與類上的 Route attribute 合并,變成:http://localhost:999/hello/something/sayhi/Peter。這時(shí),字符串 Peter 會(huì)傳給 SayHi 方法的 name 參數(shù),因?yàn)椋瑓?shù)的名字與 Route 中的參數(shù)名是相同的,都叫 name。如果 SayHi 中的參數(shù)名不叫 name,那你得運(yùn)用一下 FromRouteAttribute 了。就像這樣。

[Route("{name?}")]        public IActionResult SayHi([FromRoute(Name = "name")]string who)
        {
            ……
        }

如果你希望 URL 中給 name 傳入 int 類型的值,你還可以限制它。

[Route("{name:int}")]

其實(shí)這些約束條件對(duì)應(yīng)的是 Microsoft.AspNetCore.Routing.Constraints 命名空間下面的類型。

ASP.NET Core中怎么給路由規(guī)則命名

Route Data

Route data 其實(shí)就是一個(gè)字典,存放的就是 URL 路徑規(guī)則中參數(shù)與值的 key-value 對(duì)。這個(gè)很簡(jiǎn)單,我舉個(gè)例子,你就明白了。

咱們就直接用上面那個(gè)例子吧。

[Route("hello/[controller]/[action]")]

    public class SomethingController : Controller

    {

        [Route("{name?}")]

        public IActionResult SayHi([FromRoute(Name = "name")]string who)

        {

            return Json(RouteData.Values);

        }

    }

在 SayHi 方法中,咱們把 route data 返回。

運(yùn)行應(yīng)用后,輸入地址:http://localhost/hello/something/sayhi/Tom,得到的輸出如下:

ASP.NET Core中怎么給路由規(guī)則命名

不用我解釋了吧。

給路由命名

上面的都是 F 話,本小節(jié)才是本文的主題。我們回頭看看上面老周舉過(guò)例的那個(gè) route。

app.UseMvc(route =>
            {
                route.MapRoute("main", "{controller=Students}/{action=List}/{sid?}");
                route.MapRoute("edit_post", "{controller}-{action}");
            });

每條路由規(guī)則都會(huì)有自己的 name,為啥要命名?最直接的理由是為了唯一標(biāo)識(shí)每條規(guī)則。除了此因素外,我們可以在開發(fā)過(guò)程中選擇使用哪條規(guī)則,有了 name,想找出某條規(guī)則就好辦了,就好比你上學(xué)的時(shí)候,老師點(diǎn)名,要么點(diǎn)姓名,要么點(diǎn)學(xué)號(hào)。

基于 Attribute 的路由規(guī)則也可以命名的,例如。

[Route("hello/[controller]/[action]", Name = "prv")]

這樣就把它命名為 prv 了,你還可以這樣寫。

[Route("hello/[controller]/[action]", Name = "[controller]_[action]")]

這樣也可以用 Controller 和 Action 的名字生成一個(gè)唯一的名字,比如 Something_SayHi。但是這種方法太動(dòng)態(tài)了,好像不那么好操控,還是用一個(gè)固定的名字好一點(diǎn)。

要在開發(fā)的時(shí)候選擇使用指定的 URL 路由,需要在 Razor 頁(yè)中添加 Tag Helper,標(biāo)記幫助類可以擴(kuò)展 HTML 標(biāo)記的某些功能。在需要使用 tag helper 的頁(yè)面,或者統(tǒng)一在 _ViewImports.cshtml 頁(yè)中加入這些指令。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

格式是這樣的:

<類型全路徑>, <程序集>

類型寫在前面(包括 namespace 名),程序集名寫在后面,用逗號(hào)分隔。這里用星號(hào)(*)是最爽的,它是通配符,表示引入所有 tag helper 類型。這樣快捷,一行代碼了事。

然后在 HTML 中你這樣寫。

<form method="post"

          asp-route="edit_post">

        <div class="form-group">

            <label asp-for="Name"></label>

            <input asp-for="Name" class="form-control"/>

            <span asp-validation-for="Name" class="text-danger"></span>

        </div>

        <div class="form-group">

            <label asp-for="Age"></label>

            <input asp-for="Age" class="form-control"/>

            <span asp-validation-for="Age" class="text-danger"></span>

        </div>

        <input asp-for="ID"/>

        <button type="submit" class="btn btn-dark">提交</button>

    </form>

其他代碼你不用看了,只看這一句就夠了:

asp-route="edit_post"

它的意思就是使用我剛剛定義的那條規(guī)則。

route.MapRoute("edit_post", "{controller}-{action}");

所以,在運(yùn)行后就會(huì)生成這樣的 HTML。

<form method="post" action="/Students-Editdata">
        <div class="form-group">
            此處省略 1650 個(gè)字</form>

因?yàn)槲叶x的規(guī)則是 {controller}-{action}的形式,所以,Controller 是 Students,Action 是 Editdata,連起來(lái)就是 Students-Editdata。

那么,這里它為什么能識(shí)別出 controller 和 action 的值呢,你看看我的代碼就知道了。

public class StudentsController : Controller

    {

        readonly StudentDBContext m_context;

        // 接收依賴注入

        public StudentsController(StudentDBContext c)

        {

            m_context = c;

        }

        public IActionResult List()

        {

            var q = from s in m_context.Students

                    orderby s.ID

                    select s;

            return View(q.ToList());

        }

        /***************************************************/

        // 以下方法用于編輯頁(yè)

        [HttpGet]

        public IActionResult Editdata([FromRoute(Name = "sid")] int id)

        {

            var q = from s in m_context.Students

                    where id == s.ID

                    select s;

            Student stu = q.FirstOrDefault();

            if(stu == null)

            {

                return Content("在地球上找不到此學(xué)員。");

            }

            return View(stu);

        }

        [HttpPost]

        public IActionResult Editdata(Student s)

        {

            if (ModelState.IsValid == false)

            {

                return View(s);

            }

            m_context.Students.Update(s);

            m_context.SaveChanges();

            return RedirectToAction(nameof(List));

        }

    }

定義了 Editdata 方法的重載,一個(gè)用于 get 請(qǐng)求,一個(gè)用于 post 請(qǐng)求,form 是以 post 方式提交,因此它能自動(dòng)識(shí)別出 controller 和 action 的名字。

那萬(wàn)一,如果不是同名的呢,好辦。你用 asp-route-<value> 來(lái)指定各個(gè)參數(shù)的值。比如這樣

<form method="post"
          asp-route="edit_post"
          asp-route-controller="Demo"
          asp-route-action="Runwork"
          asp-route-sid="1">

在 asp-route- 后面直接跟上路由規(guī)則參數(shù)的名稱就可以了。

看完上述內(nèi)容,你們對(duì)ASP.NET Core中怎么給路由規(guī)則命名有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI