標籤:iap 路由配置 表單 html har 技術分享 地方 期望 資料互動
前言
本節我們來講講ASP.NET Core中的路由,在講路由之前我們首先回顧下之前所講在ASP.NET Core中的模型繫結這其中有一個問題是我在項目當中遇見的,我們下面首先來看看這個問題。
回顧ASP.NET Core模型繫結
我們有這樣一個情境:修改設定檔中的各個屬性,此時每個屬性的值的類型肯定是不一樣的,所以我們將值定義為object,如下model。
public class BlogViewModel { public string prop { get; set; } public object value { get; set; } }
我們在前台進行提交,如下:
<script type="text/javascript"> $(function () { var model = { prop: "Jeffcky", value: "cnblogs" }; $("#btn").on("click", function () { $.ajax({ url: "/home/index", type: "post", contentType: "application/x-www-form-urlencoded;charset=utf-8", dataType: "json", data: model, success: function (data) { } }); }); });</script>
我們在後台接收傳遞的對象。
[HttpPost] public IActionResult Index(BlogViewModel model) { return View(); }
此時我們看到將實值型別定義為object根本接收不到值,當我將其修改為string肯定是好使的。之前以為利用表單接收任何對象都是好使的,在實際應用時卻不如我們所期望的那樣(對於此種情況暫時未找到解決方案)。在這種情況下我只好利用contentType:"application/json"來解決,如下:
$(function () { var model = { prop: "Jeffcky", value: "cnblogs" }; $("#btn").on("click", function () { $.ajax({ url: "/home/index", type: "post", contentType: "application/json;charset=utf-8", dataType: "json", data: JSON.stringify(model), success: function (data) { } }); }); });
[HttpPost] public IActionResult Index([FromBody] BlogViewModel model) { return View(); }
只能轉換思維來解決,好了到了這裡我們對於對象利用模型繫結遇到的問題到此結束,接下來我們開始講述路由。
ASP.NET Core MVC/WebAPi路由作用
無論是在ASP.NET MVC/WebAPi還是ASP.NET Core MVC/WebAPi,我們都一直在講路由,為什麼每次都要拿出來說呢,因為它重要,從前台到背景資料互動需要通過路由解決,所以我們需要在ASP.NET Core重點拿出來講,我們得好好說說路由的好處是什麼呢,請往下看。
(1)SEO
SEO即Search Engine Optimization,我們翻譯過來就是搜尋引擎最佳化,引入路由就是為了呈現友好的SEO,一個友好的SEO即能夠非常準確的描述需要請求的資源,對於使用者而言它能更好的去擷取想要的內容,可以增加網址訪問的次數,當然了也可以是網址易於收錄到搜尋引擎中。
(2)URL不需要映射到檔案
如果沒有路由的話,如果過來一個請求此時需要映射到磁碟上真實存在的物理檔案,有了路由我們可以完全控制過來的請求,當一個確定的HTTP請求過來時我們可以引導到其到某個控制器上對應的action方法。
(3)長的URL和擴充都將會被淘汰
我們能夠知道當我們訪問一個頁面時有些直接以副檔名為.aspx或者html呈現,現在我們有了路由,完全不需要副檔名並且會縮短URL的長度。
好了我們講完路由的好處,我們就要看看在ASP.NET Core中的路由到底是怎樣的呢。
ASP.NET Core MVC/WebAPi路由方式建立預設路由
這個就不用多講了,當我們建立ASP.NET Core應用程式時在Startup中就會建立預設的路由如下:
public class Startup{ public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }}
這是預設給我們建立的,看著有點不太舒服,我還是習慣將其修改如下等同的路由配置。
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller}/{action}/{id?}", defaults: new { controller = "Home", action = "Index" }); });擴充預設路由
上述只是我們建立的預設路由,當我們需要額外進行自訂擴充對於特定需求,所以我們如上類似再來擴充一個路由。
app.UseMvc(routes => {
//擴充路由 routes.MapRoute( name: "about-route", template: "about", defaults: new { controller = "Home", action = "About" }); routes.MapRoute( name: "default", template: "{controller}/{action}/{id?}", defaults: new { controller = "Home", action = "Index" }); });使用路由特性
我們也可以配置路由特性針對控制器和Action方法,如下:
[Route("[controller]")] public class HomeController : Controller { private IBlogRepository _blogRepository; public HomeController(IBlogRepository blogRepository) { _blogRepository = blogRepository; } [Route("[action]")] public IActionResult Index() { return View(); } [Route("Index")] [HttpPost] public IActionResult Index([FromBody] BlogViewModel model) { return View(); } }
上述[Route("[controller]")]和[Route("[action]")])都是引用的聲明的控制器名稱和方法名稱,即Home控制器和Index方法,所以上述兩個action方法都是匹配的/Home/Index只是請求方式不同而已。在官網中有使用路由中介軟體的方式,有需要的可以參考一下:【https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing】
RESTful風格路由
對於RESTful風格路由我們更多的是用在請求ASP.NET Core WebAPi介面上,如下:
[Route("api/[controller]")] public class Blog : Controller { [HttpGet] // api/blog public IEnumerable<string> Get() { return new string[] { "hello", "world!" }; } [HttpPost("Post")] // api/blog/post public IActionResult PostBlog([FromBody] BlogViewModel model) { return View(); } }
那麼問題來了,如果是有參數我們該進行如何傳遞呢,當然有解決方案,如下:
[HttpPost("{id}")] public void PostUpdate(int id, [FromBody] string value) { }
此時前台請求如下:
$("#btn").on("click", function () { $.ajax({ url: "/api/blog/2", type: "post", contentType: "application/json;charset=utf-8", dataType: "json", data: JSON.stringify("Jeffcky"), success: function (data) { } }); });使用約束
對於參數類型是否非法,我們通過對參數進行約束來達到我們得目的,如下:
[HttpPost("{id:int}")] public void PostUpdate(int id, [FromBody] string value) { }
或者對參數約束為guid,如下:
[HttpPost("{id:guid}")] public void PostUpdate(string id, [FromBody] string value) { }
當然還有其他型別參數約束就不一一列舉了。
總結
本節我們講解了ASP.NET Core中的路由使用,比較基礎性的東西,更深入的東西參看官網資料,如若有不太理解和有所疑惑的地方請在評論中指出看到會馬上回複。
ASP.NET Core MVC/WebAPi如何構建路由?