您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(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è)了。
我們都知道,在 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)意義。
在 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 命名空間下面的類型。
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,得到的輸出如下:
不用我解釋了吧。
上面的都是 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è)資訊頻道,感謝大家的支持。
免責(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)容。