第一部分主要介紹了什麼是WebApi,以及它是幹什麼的,怎麼去調用後臺數據等等。。。javascript
今天就繼續來學習一個新的知識。在上一篇文章中主要是介紹了一下如何根據根據Ajax去調用後臺增刪改查的數據。java
那麼,難道咱們只能針對一個表的數據進行增刪改查的數據嗎?好比咱們要進行一個登錄操做,上傳照片等等。。。改怎麼去實現某一特定的業務需求呢?ajax
第一步:建立一個LoginViewModel類api
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace Demo.Models 7 { 8 public class LoginViewModel 9 { 10 public string LoginName { get; set; } 11 public string LoginPwd { get; set; } 12 } 13 }
第二步:建立User控制器異步
能夠看到有一個[RoutePrefix]的標識,實際上之因此可以標識也是一個特性類的做用,而且我寫了一個"api/User"的參數。post
這個參數有啥用呢?學習
我在Login方法上也作了一個[Route]的標識,注意在請求時要與[Route]設置的名稱爲主,不能和方法名爲主!!!url
這兩個組合在一塊兒就成了一個完整的路由,在調用時,能夠手動根據咱們本身建立的路由規則去調用後臺的數據。spa
上一篇文章中存在RESTful語義化風格的Get、post等必需要加方法名Get做爲前綴,否則沒法訪問。。。code
在這裏經過自定義路由規則就能夠解決這個「死板」的問題了。。
1 using Demo.Models; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Net; 6 using System.Net.Http; 7 using System.Web.Http; 8 9 namespace Demo.Controllers 10 { 11 //WebApi:只管處理數據 12 13 //在控制器上方加一個路由前綴來肯定請求的一個控制器 RoutePrefix Prefix意爲前綴 14 [RoutePrefix("api/User")] 15 public class UserController : ApiController 16 { 17 //此處沒有Restful風格語義化 因此須要本身手動指定此處須要什麼樣的請求 18 [HttpPost] 19 //定義一個路由名稱爲 Login,即RouteName,這時,它會和前綴組合成一個完整的路由 20 [Route("Login")] 21 public string Login(LoginViewModel model) 22 { 23 return "Ok"; 24 } 25 [HttpGet] 26 [Route("Messages")] 27 public IHttpActionResult GetMessage() 28 { 29 return Ok(new Student() { 30 Id=80, 31 Name="及格了" 32 }); 33 } 34 35 } 36 37 }
例如:
Html代碼段部分:
這裏我就只寫ajax部分的代碼了,其餘Html標籤就很少贅述了。。。
主要是看url請求的地址:/api/User/Login
1 <script type="text/javascript"> 2 $.ajax({ 3 url: "/api/User/Login", 4 type: "post", 5 data: { 6 LoginName: "admin", 7 LoginPwd: "123" 8 9 } 10 <script>
固然了,它也能夠做爲一個對象傳遞給客戶端。GetMessage()方法裏面
在這裏建立了一個學生類:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 namespace Demo.Models 7 { 8 public class Student 9 { 10 public int Id { get; set; } 11 public string Name { get; set; } 12 } 13 }
那怎麼去理解IHttpActionResult呢?
IHttpActionResult:能夠看到它是一個接口,接口代碼:返回結果是HttpResponesMessage的任務。我可不能夠認爲這是後臺數據在傳遞到客戶端是,返回的狀態碼?一個狀態碼錶明一個返回結果。
好比
return Ok() 狀態碼:200
NotFound() 狀態碼:404
return InternalServerError(new Exception("你錯了")) 狀態碼:500
實際上這些方法都只能在IHttpActionResult中實現的。
想一想接口中通常是有一個類,幾個方法
若是須要驗證的話能夠去試試F12看看NetWork裏面是否該方法對應了本身的狀態碼
正是該方法實現了該接口,全部才能夠進行處理。
那麼這裏須要注意的是隻有 Return Ok(),才能帶數據到客戶端。。。
1 using System.Net.Http; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 namespace System.Web.Http 6 { 7 // 8 // 摘要: 9 // 定義一個用於以異步方式建立 System.Net.Http.HttpResponseMessage 的命令。 10 public interface IHttpActionResult 11 { 12 // 13 // 摘要: 14 // 以異步方式建立 System.Net.Http.HttpResponseMessage。 15 // 16 // 參數: 17 // cancellationToken: 18 // 要監視的取消請求標記。 19 // 20 // 返回結果: 21 // 在完成時包含 System.Net.Http.HttpResponseMessage 的任務。 22 Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken); 23 } 24 }
User控制器:在這裏的請求方式是Get,由於作了一個[HttpGet]的標識
1 using Demo.Models; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Net; 6 using System.Net.Http; 7 using System.Web.Http; 8 9 namespace Demo.Controllers 10 { 11 //WebApi:只管處理數據 12 13 //在控制器上方加一個路由前綴來肯定請求的一個控制器 RoutePrefix Prefix意爲前綴 14 [RoutePrefix("api/User")] 15 public class UserController : ApiController 16 { 17 //此處沒有Restful風格語義化 因此須要本身手動指定此處須要什麼樣的請求 18 [HttpPost] 19 //定義一個路由名稱爲 Login,即RouteName,這時,它會和前綴組合成一個完整的路由 20 [Route("Login")] 21 public string Login(LoginViewModel model) 22 { 23 return "Ok"; 24 } 25 [HttpGet] 26 [Route("Messages")] 27 public IHttpActionResult GetMessage() 28 { 29 return Ok(new Student() { 30 Id=80, 31 Name="及格了" 32 }); 33 } 34 35 } 36 }