Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
URL是Uniform Resource Locator的首字母縮寫(xiě),名為統(tǒng)一資源定位符,主要負(fù)責(zé)定位查找Internet中的信息資源,是Internet上標(biāo)準(zhǔn)的資源地址。資源是個(gè)抽象的概念,既可以指某個(gè)文件也可以指某方法調(diào)用的結(jié)果,所以URL不僅可以包含了文件的信息,也可以攜帶參數(shù)。
URL主要由四部分組成,他們分別是傳輸協(xié)議、服務(wù)器地址、端口號(hào)、路徑名,中間用“/”符號(hào)拼接:
傳輸協(xié)議指的是要訪(fǎng)問(wèn)的服務(wù)器的傳輸類(lèi)型,如FTP(文件傳輸協(xié)議)、SMTP(電子郵件協(xié)議)、HTTP(超文本傳輸協(xié)議)、HTTPS(超文本傳輸安全協(xié)議)、DNS(域名系統(tǒng)協(xié)議)、TELNET(會(huì)話(huà)協(xié)議)等等,當(dāng)然這里我們WEB指的是一般都是HTTP或者HTTPS。
服務(wù)器地址用來(lái)定位資源所存在的機(jī)器,在公網(wǎng)中每臺(tái)服務(wù)器會(huì)分配一個(gè)唯一的IP地址,我們可以通過(guò)IP找到對(duì)應(yīng)的服務(wù)器。
端口號(hào)連接時(shí)所使用的通信端口號(hào),這是Internet用來(lái)辨別信息服務(wù)用的一種軟件標(biāo)識(shí)。因?yàn)橐慌_(tái)服務(wù)器上可能部署多個(gè)服務(wù),為了能更精準(zhǔn)的當(dāng)問(wèn)到指定的服務(wù)我們就可以通過(guò)指定端口來(lái)區(qū)分。
路徑名指的是指定資源的具體文件路徑或者方法調(diào)用,由于資源不一定是文件,所以路徑中常常會(huì)攜帶參數(shù),在方法調(diào)用的時(shí)候進(jìn)行傳參。
ASP.NET MVC 路由是建立在Asp.NetFramework之上的組件,路由機(jī)制同樣也可以應(yīng)用在WebForms應(yīng)用中,對(duì)于ASP.NET Web Forms來(lái)說(shuō),路由定位的是一個(gè)有效的文件。這個(gè)文件可以是靜態(tài)的圖片、視頻等文件,也可以是.aspx動(dòng)態(tài)頁(yè)面。而對(duì)于ASP.NET MVC來(lái)說(shuō),路由則是指向了某個(gè)Controller類(lèi)型中的Action方法,同時(shí)支持URL參數(shù)傳遞,這讓路由屬性更加靈活多變,可控性也強(qiáng)。
1,安全性高,避免直接訪(fǎng)問(wèn)物理資源,提高了系統(tǒng)的安全性;
2,靈活性強(qiáng),URL不會(huì)因?yàn)槲锪髻Y源的改變而改變;
3,可讀性好,通過(guò)定義URL可以直觀的知道訪(fǎng)問(wèn)的資源類(lèi)型;
4,SEO優(yōu)化,良好的URL規(guī)范容易被搜索引擎識(shí)別收錄;
5,易重寫(xiě),可以在不同的路由模式的操作上重寫(xiě)默認(rèn)路由。
在創(chuàng)建一個(gè)新的ASP.NET MVC項(xiàng)目時(shí)在項(xiàng)目的根目錄中生成一個(gè)Global.asax文件,它是一個(gè)全局文件也是項(xiàng)目運(yùn)行時(shí)的初始函數(shù),它的作用是全局注冊(cè)組件,比如申明全局注冊(cè)、Filters注冊(cè)、 Route注冊(cè)、Bundle注冊(cè)等。項(xiàng)目啟動(dòng)時(shí)會(huì)自動(dòng)調(diào)用Global.asax文件中的Application_Start方法,該方法中默認(rèn)申明了全局注冊(cè)及路由注冊(cè)。
Application_Start方法則調(diào)用了RegisterRoutes的方法(這個(gè)方法在~/App_Start/RouteCOnfig.cs中被定義),用來(lái)向ASP.NET MVC 注冊(cè)了路由規(guī)則,通過(guò)RouteCollection 的MapRoute方法(MVC提供MapRoute、MapPageRoute、IgnoreRoute三種方式)向系統(tǒng)增加一條路由規(guī)則,這個(gè)路由規(guī)則適用于所有的控制器。
name:路由的名稱(chēng);
url:這是個(gè)路由匹配規(guī)則,告訴系統(tǒng)請(qǐng)求資源的路徑,也就是我們URL中的路徑名,這里每個(gè)部分用{}括起來(lái),相當(dāng)于占位符,是變量,用來(lái)申明URL中的每個(gè)組成部分;
defaults:這是個(gè)默認(rèn)的對(duì)象,{}中的變量指向了固定的參數(shù)表示執(zhí)行匹配,這里是告訴系統(tǒng)去Home Controller控制器中找Index方法并且傳入id這個(gè)參數(shù),因此我們必須保證在項(xiàng)目的Controllers文件夾中必須有一個(gè)叫做HomeController的對(duì)象且對(duì)象中必須有Index這個(gè)方法,否則在訪(fǎng)問(wèn)該路由時(shí)就會(huì)提示資源不存在,而Optional 是可選沒(méi)有也可以。
有了以上配置就可以滿(mǎn)足大部分的路由配置了,我們可以把更多的時(shí)間用在Model、View和Controller模塊開(kāi)發(fā)上,MVC 會(huì)自動(dòng)去匹配每一個(gè)路由,直到找到匹配的路由并將請(qǐng)求映射到對(duì)應(yīng)的action上,如果沒(méi)有找到指定的路由就會(huì)彈出404錯(cuò)誤提示。比如RouteCOnfig.cs中的defaults: new { controller="Home", action="Index", id=UrlParameter.Optional }就告訴我們當(dāng)我們啟動(dòng)程序時(shí)默認(rèn)執(zhí)行HomeController控制器中的Index方法,向用戶(hù)展示index.cshtml頁(yè)面。如果Controller中不存在對(duì)應(yīng)的控制器和方法時(shí)就會(huì)報(bào)“/”應(yīng)用程序中的服務(wù)器錯(cuò)誤。
特性路由就是利用特性去定義路由讓你在應(yīng)用程序中能更好的控制URL,特性路由可以簡(jiǎn)化URL和Action之間的映射關(guān)系。添加了特性路由后只能通過(guò)特性路由設(shè)置的路徑訪(fǎng)問(wèn),一般我們可以在一個(gè)項(xiàng)目中同時(shí)使用特性路由和傳統(tǒng)路由兩種技術(shù)。要啟用特性路由只需要在RouteConfig.cs路由配置中調(diào)用方法:MapMvcAttributeRoutes()即可。
特性路由可以通過(guò)[Route]和[RoutePrefix]特性來(lái)自定義路由,[RoutePrefix]只作用于Controller,當(dāng)定義了[RoutePrefix]特性時(shí)必須定義[Route]特性,此時(shí)的接口路由是“協(xié)議+IP+Port+RoutePrefix特性+Route特性”,如圖:http://localhost:54639/Test/TestView
注意:當(dāng)Action定義了Router特性時(shí)Controller中定義的Route特性中的action指向的是Action中的Route特性,而不是Action方法名,也就是說(shuō)下圖中通過(guò)http://localhost:54639/Test/index路由是訪(fǎng)問(wèn)不到資源的。
[Route]主要作用于Action路由重寫(xiě),當(dāng)在Action前定義了Route特性時(shí),路由只能通過(guò)Route特性中的路由進(jìn)行資源訪(fǎng)問(wèn),如果希望當(dāng)前Action支持多路由訪(fǎng)問(wèn)則可以定義多個(gè)Route特性。如下圖該方法即可以通過(guò)http://localhost:54639/home/test訪(fǎng)問(wèn),也可以通過(guò)http://localhost:54639/test訪(fǎng)問(wèn)。
? 當(dāng)[Route]作用于Controller時(shí)RouteData 必須包含名為“action”且值為非空的字符串,此時(shí)Acion中就可以不用再單獨(dú)定義Route特性了。如[Route("Home/{action}")],當(dāng)我們請(qǐng)求http://localhost:54639/Home/index時(shí)系統(tǒng)會(huì)自動(dòng)去尋找符合特性路由[Route("Home/{action}")]下的index方法。
通過(guò)前面的路由配置我們可以實(shí)現(xiàn)大部分路由配置了,但仔細(xì)查看還是會(huì)發(fā)現(xiàn)問(wèn)題,作為路由參數(shù)匹配時(shí)路由參數(shù)會(huì)匹配任何非空字符,所以不管是int類(lèi)型還是string類(lèi)型都能匹配到當(dāng)前路由。此時(shí)系統(tǒng)發(fā)現(xiàn)滿(mǎn)足路由的Acion方法有兩個(gè),這時(shí)系統(tǒng)就會(huì)將參數(shù)作為方法參數(shù)傳遞給Action并試圖執(zhí)行兩個(gè)Action方法,此時(shí)系統(tǒng)會(huì)報(bào)錯(cuò):當(dāng)前請(qǐng)求在以下操作方法之間不明確。
? 這時(shí)我們就可以通過(guò)路由約束來(lái)進(jìn)行控制,當(dāng)路由參數(shù)滿(mǎn)足路由約束條件時(shí)才匹配該路由并執(zhí)行相應(yīng)的Acion方法,當(dāng)路由參數(shù)為int類(lèi)型時(shí)則執(zhí)行第一條路徑,否則則選擇第二條路線(xiàn)。通過(guò)在參數(shù)約束后面添加一個(gè)問(wèn)號(hào)表示URI參數(shù)是可選的,也可以添加等號(hào)為其指定默認(rèn)值。 當(dāng)然也可以將多個(gè)約束應(yīng)用于一個(gè)參數(shù),只要用冒號(hào)分隔開(kāi)即可。
? .Net提供了大量的路由約束且默認(rèn)加載了這些路由約束,當(dāng)我們使用約束時(shí)會(huì)去驗(yàn)證路由參數(shù),通過(guò)TryParse()方法對(duì)參數(shù)嘗試轉(zhuǎn)換變量并提取參數(shù)字符串,返回ture則通過(guò),false則跳過(guò)。除了通過(guò)使用類(lèi)型和值約束來(lái)約束也可以用正則表達(dá)式來(lái)約束路由,只有與正則指定的類(lèi)型匹配才能通過(guò)該路由。?
更多ASP.NET MVC實(shí)戰(zhàn)技巧可以參考專(zhuān)欄:ASP.NET MVC實(shí)戰(zhàn)系列
TML 幫助器用于修改 HTML 輸出。
HTML 幫助器
通過(guò) MVC,HTML 幫助器類(lèi)似于傳統(tǒng)的 ASP.NET Web Form 控件。
就像 ASP.NET 中的 Web Form 控件,HTML 幫助器用于修改 HTML。但是 HTML 幫助器是更輕量級(jí)的。與 Web Form 控件不同,HTML 幫助器沒(méi)有事件模型和視圖狀態(tài)。
在大多數(shù)情況下,HTML 幫助器僅僅是一個(gè)返回字符串的方法。
通過(guò) MVC,您可以創(chuàng)建您自己的幫助器,或者直接使用內(nèi)建的 HTML 幫助器。
標(biāo)準(zhǔn)的 HTML 幫助器
MVC 包含了大多數(shù)常用的 HTML 元素類(lèi)型的標(biāo)準(zhǔn)幫助器,比如 HTML 鏈接和 HTML 表單元素。
HTML 鏈接
呈現(xiàn) HTML 鏈接的最簡(jiǎn)單的方法是使用 HTML.ActionLink() 幫助器。
通過(guò) MVC,Html.ActionLink() 不連接到視圖。它創(chuàng)建一個(gè)連接到控制器操作。
Razor 語(yǔ)法:
@Html.ActionLink("About this Website", "About")
ASP 語(yǔ)法:
<%=Html.ActionLink("About this Website", "About")%>
第一個(gè)參數(shù)是鏈接文本,第二個(gè)參數(shù)是控制器操作的名稱(chēng)。
上面的 Html.ActionLink() 幫助器,輸出以下的 HTML:
<a href="/Home/About">About this Website</a>
Html.ActionLink() 幫助器的一些屬性:
屬性 | 描述 |
---|---|
.linkText | URL 文本(標(biāo)簽),定位點(diǎn)元素的內(nèi)部文本。 |
.actionName | 操作(action)的名稱(chēng)。 |
.routeValues | 傳遞給操作(action)的值,是一個(gè)包含路由參數(shù)的對(duì)象。 |
.controllerName | 控制器的名稱(chēng)。 |
.htmlAttributes | URL 的屬性設(shè)置,是一個(gè)包含要為該元素設(shè)置的 HTML 特性的對(duì)象。 |
.protocol | URL 協(xié)議,如 "http" 或 "https"。 |
.hostname | URL 的主機(jī)名。 |
.fragment | URL 片段名稱(chēng)(定位點(diǎn)名稱(chēng))。 |
注釋?zhuān)?/strong>您可以向控制器操作傳遞值。例如,您可以向數(shù)據(jù)庫(kù) Edit 操作傳遞數(shù)據(jù)庫(kù)記錄的 id:
Razor 語(yǔ)法 C#:
@Html.ActionLink("Edit Record", "Edit", new {Id=3})
Razor 語(yǔ)法 VB:
@Html.ActionLink("Edit Record", "Edit", New With{.Id=3})
上面的 Html.ActionLink() 幫助器,輸出以下的 HTML:
<a href="/Home/Edit/3">Edit Record</a>
HTML 表單元素
以下 HTML 幫助器可用于呈現(xiàn)(修改和輸出)HTML 表單元素:
BeginForm()
EndForm()
TextArea()
TextBox()
CheckBox()
RadioButton()
ListBox()
DropDownList()
Hidden()
Password()
ASP.NET 語(yǔ)法 C#:
<%=Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()){%>
<p>
<label for="FirstName">First Name:</label>
<%=Html.TextBox("FirstName") %>
<%=Html.ValidationMessage("FirstName", "*") %>
</p>
<p>
<label for="LastName">Last Name:</label>
<%=Html.TextBox("LastName") %>
<%=Html.ValidationMessage("LastName", "*") %>
</p>
<p>
<label for="Password">Password:</label>
<%=Html.Password("Password") %>
<%=Html.ValidationMessage("Password", "*") %>
</p>
<p>
<label for="Password">Confirm Password:</label>
<%=Html.Password("ConfirmPassword") %>
<%=Html.ValidationMessage("ConfirmPassword", "*") %>
</p>
<p>
<label for="Profile">Profile:</label>
<%=Html.TextArea("Profile", new {cols=60, rows=10})%>
</p>
<p>
<%=Html.CheckBox("ReceiveNewsletter") %>
<label for="ReceiveNewsletter" style="display:inline">Receive Newsletter?</label>
</p>
<p>
<input type="submit" value="Register" />
</p>
<%}%>
介紹asp.net core路由時(shí),我初步想了下,分幾篇來(lái)說(shuō)明。 路由的知識(shí)點(diǎn)很多,參考了官方文檔提取出一些重要的知識(shí)點(diǎn)來(lái)說(shuō)。 在ASP.NET Core中是使用路由中間件來(lái)匹配傳入請(qǐng)求的 URL 并將它們映射到操作(action方法)。路由是在程序啟動(dòng)時(shí)進(jìn)行傳統(tǒng)路由或?qū)傩月酚啥x。 路由描述如何將 URL 路徑與操作相匹配。 它還用于在響應(yīng)中生成送出的 URL(用于鏈接)。
路由操作既支持傳統(tǒng)路由,也支持屬性路由。也可混合使用。通常傳統(tǒng)路由用于為瀏覽器處理 HTML 頁(yè)面的控制器。屬性路由用于處理 web API 的控制器。
1.1設(shè)置路由中間件
要使用傳統(tǒng)路由,必須在UseMVC中間件中配置實(shí)現(xiàn)IRouteBuilder接口,在asp.net core mvc 2.2 框架下,應(yīng)用程序Startup的Configure 方法中,默認(rèn)路由設(shè)置如下:
app.UseMvc(routes=> { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
在對(duì) UseMvc調(diào)用中,MapRoute 用于創(chuàng)建單個(gè)路由,亦稱(chēng) default 路由。 大多數(shù) MVC 應(yīng)用使用帶有模板的路由。對(duì)于default路由簡(jiǎn)便的方法可以使用:
app.UseMvcWithDefaultRoute();
UseMvc 和 UseMvcWithDefaultRoute 可向中間件管道添加 RouterMiddleware 的實(shí)例。 MVC 不直接與中間件交互,而是使用路由來(lái)處理請(qǐng)求。 MVC 通過(guò) MvcRouteHandler 實(shí)例連接到路由。
UseMvc 不直接定義任何路由,它向?qū)傩月酚傻穆酚杉咸砑诱嘉环鹻controller=Home}/{action=Index}/{id?} 。通過(guò)重載 UseMvc(Action<IRouteBuilder>) 則允許用戶(hù)添加自己的路由,并且還支持屬性路由。
1.2 傳統(tǒng)路由
傳統(tǒng)路由是:具有描述性的路由方案,這樣URL具有可讀性。傳統(tǒng)路由格式:{controller=Home}/{action=Index}/{id?}這樣的url路徑是設(shè)定了一個(gè)約定: 第一段映射到控制器名稱(chēng), 第二段映射到操作名稱(chēng),第二段映射到可選ID。
(1) 使用默認(rèn)路由:
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
使用此默認(rèn)路由時(shí): url路徑/Products/List 將映射到程序ProductsController(控制器).List(action)中。 url路徑/Blog/Article/17將映射到程序BlogController(控制器).Article(action)中。
(2) 多個(gè)路由:
通過(guò)添加對(duì) MapRoute 的多次調(diào)用,可以在 UseMvc 內(nèi)添加多個(gè)路由。 這樣做可以定義多個(gè)約定,或添加專(zhuān)用于特定操作的傳統(tǒng)路由,比如:
app.UseMvc(routes=> { routes.MapRoute("blog", "blog/{*article}", defaults: new { controller="Blog", action="Article" }); routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); });
這里的blog路由是一個(gè)專(zhuān)用的傳統(tǒng)路由,這表示blog使用傳統(tǒng)路由系統(tǒng),但專(zhuān)用于特定的操作,也就是對(duì)于BlogController控制器的Article操作,此專(zhuān)用路由將始終映射。對(duì)于多個(gè)路由的路由集合會(huì)進(jìn)行排序,并按添加順序進(jìn)行處理,因此,在此示例中,將先嘗試 blog 路由,再?lài)L試 default 路由。
(3) action操作的區(qū)分
在處理url請(qǐng)求時(shí),當(dāng)通過(guò)路由匹配到一個(gè)控制器內(nèi)兩項(xiàng)相同的action名稱(chēng)時(shí),mvc必須進(jìn)行區(qū)分,以選擇最佳候選項(xiàng),否則會(huì)引發(fā)異常(AmbiguousActionException)。
public class ProductsController : Controller { public IActionResult Edit(int id) { ... } [HttpPost] public IActionResult Edit(int id, Product product) { ... } }
此Products控制器定義了二項(xiàng)操作,這兩項(xiàng)操作均與 URL 路徑的 /Products/Edit/17 匹配相同。解決方案是將要提交的action加上 Http 謂詞為 POST。這樣post過(guò)來(lái)時(shí),就會(huì)選擇Edit(int, Product)
1.3 屬性路由
通過(guò)在控制器(Controller)或操作(Action)上放置路由可實(shí)現(xiàn)屬性路由。 不能通過(guò)傳統(tǒng)路由訪(fǎng)問(wèn)定義屬性路由的操作,反之亦然。 控制器上的任何路由屬性,都會(huì)使控制器中的所有操作使用屬性路由。
屬性路由使用一組屬性將action直接映射到路由模板。在下面的示例中,Configure 方法使用 app.UseMvc();,不傳遞任何路由。 HomeController 將匹配一組 URL,這組 URL 與默認(rèn)路由 {controller=Home}/{action=Index}/{id?} 匹配的 URL 類(lèi)似:
當(dāng)去掉default默認(rèn)路由模板后,只使用app.UseMvc()時(shí)。運(yùn)行程序時(shí),頁(yè)面報(bào)404錯(cuò)誤:找不到 localhost 的網(wǎng)頁(yè)。
app.UseMvc();
(1) 屬性路由基本使用
如果定義了屬性路由的操作,此時(shí)就是啟動(dòng)屬性路由功能。Home控制器的屬性路由示例如下:
public class HomeController : Controller { [Route("")] [Route("Home")] [Route("Home/Index")] public IActionResult Index() { return View(); } }
在index的action上加[Route("")]屬性路由。 瀏覽器可以使用下面三種url來(lái)訪(fǎng)問(wèn),也是程序啟動(dòng)時(shí)的默認(rèn)加載頁(yè)面:
http://localhost:30081/
http://localhost:30081/Home/
http://localhost:30081/Home/index
(2) 屬性路由精確控制
屬性路由需要更多輸入來(lái)指定路由;傳統(tǒng)的默認(rèn)路由處理路由的方式則更簡(jiǎn)潔。 但是,屬性路由允許(并需要)精確控制應(yīng)用于每項(xiàng)操作的路由模板。下面示例是精確控制每項(xiàng)操作的路由模板,比如url訪(fǎng)問(wèn)/home/index時(shí),即是調(diào)用MyIndex的action方法。
public class MyDemoController : Controller { [Route("")] [Route("Home")] [Route("Home/Index")] public IActionResult MyIndex() { return View("Index"); } }
1.4 使用 Http[Verb] 屬性的屬性路由
屬性路由還可以使用 Http[Verb] 屬性,比如 HttpPostAttribute。 所有這些屬性都可采用路由模板。 此示例展示,同一路由模板匹配的兩項(xiàng)操作:
[HttpGet("/products")] public IActionResult ListProducts() { // ... } [HttpPost("/products")] public IActionResult CreateProduct(...) { // ... }
當(dāng) Http 謂詞為 GET 時(shí)將執(zhí)行ProductsApi.ListProducts 操作, 當(dāng) Http 謂詞為 POST 時(shí)將執(zhí)行 ProductsApi.CreateProduct。生成 REST API 時(shí),很少會(huì)在操作方法上使用 [Route(...)]。 建議使用更特定的 Http*Verb*Attributes 來(lái)明確 API 所支持的操作。 REST API 的客戶(hù)端需要知道映射到特定邏輯操作的路徑和 Http 謂詞。
例如下面一個(gè)web api訪(fǎng)問(wèn)路由,使用Http*Verb*Attributes 來(lái)明確定義如下:
public class ProductsApiController : Controller { [HttpGet("/products/{id}", Name="Products_List")] public IActionResult GetProduct(int id) { ... } }
上面定義只有針對(duì)如訪(fǎng)問(wèn)url如: /products/3(而非 /products)之類(lèi)的 URL才會(huì)執(zhí)行 ProductsApi.GetProduct(int) 操作。
1.5 路由合并
若要使屬性路由減少重復(fù),可將控制器Controller上的路由屬性與各個(gè)操作Action上的路由屬性合并。 控制器上定義的所有路由模板均作為操作上路由模板的前綴。 在控制器上放置路由屬性會(huì)使控制器中的所有操作都使用屬性路由。
下面是一個(gè)web api的路由合并,訪(fǎng)問(wèn)Get的方法的訪(fǎng)問(wèn)路徑為: http://localhost:30081/api/Products/1
[Route("api/Products")] public class ProductsApiController : Controller { // GET api/values/5 [HttpGet("{id}")] public string Get(int id) { return "value"; } }
下面是一個(gè)控制器的路由合并。訪(fǎng)問(wèn)index頁(yè)面的訪(fǎng)問(wèn)路徑為: http://localhost:30081/home/index
[Route("Home")] public class HomeController : Controller { [Route("")] // Combines to define the route template "Home" [Route("Index")] // Combines to define the route template "Home/Index" [Route("/")] // Doesn't combine, defines the route template "" public IActionResult Index() { //... } }
1.6 指定屬性路由參數(shù)約束
[HttpGet("Home/{id:int}",Name="Pri")] public IActionResult Privacy(int id) { return View(); }
如果輸入非整數(shù)類(lèi)型的參數(shù),瀏覽器提示:找不到與以下網(wǎng)址對(duì)應(yīng)的網(wǎng)頁(yè):http://localhost:30081/home/dd
1.7 自定義路由屬性
該框架中提供的所有路由屬性([Route(...)]、[HttpGet(...)] 等)都可實(shí)現(xiàn) IRouteTemplateProvider接口。 當(dāng)應(yīng)用啟動(dòng)時(shí),MVC 會(huì)查找控制器類(lèi)和操作方法上的屬性,并使用可實(shí)現(xiàn) IRouteTemplateProvider的屬性生成一組初始路由。
下面使用IRouteTemplateProvider 來(lái)定義自己的路由屬性。每個(gè) IRouteTemplateProvider 都允許定義一個(gè)包含自定義路由模板、順序和名稱(chēng)的路由:
public class MyApiControllerAttribute : 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; } } public class ProductsApiController : Controller { // GET api/values/5 // [HttpGet("{id}")] [MyApiController()] public string Get(int id) { return "value"; } }
通過(guò)訪(fǎng)問(wèn)url: http://localhost:30081/api/ProductsApi/get/1 來(lái)調(diào)用get方法。
參考文獻(xiàn)
官方資料:asp.net core routing
歡迎添加個(gè)人微信號(hào):Like若所思。
歡迎關(guān)注我的公眾號(hào),不僅為你推薦最新的博文,還有更多驚喜和資源在等著你!一起學(xué)習(xí)共同進(jìn)步!
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。