在 Api 與 View 之間在卡一個 Controller 或者是 WebApi,做資料中繼站,把資料蒐集好在一次送到 View,而 View 收到資料也只需要拆解資料後分散到各個欄位之中。最後要 submit 整包送回 Model 也是一樣在 Controller 或者是 WebApi 解析驗證後再分散到各個 Api ,這樣資安會大大的提升。
因此此篇要講解如何在 Controller 對 WebApi 做讀取、新增、更新、刪除 ( CRUD ) 的動作。
1.
在 BaseController ( 如果沒有 BaseController 就寫在該隻 Controller 內 ) 繼承 ApiController 或 Controller,再來建置幾個變數:public class BaseApiController : ApiController { protected DefaultConnection db = new DefaultConnection(); // 資料庫連接 protected HttpClient client; protected HttpResponseMessage response; public BaseApiController() { client = new HttpClient(); client.BaseAddress = new Uri("Api Url"); } }
2.
這時候在可以在 Controller 去非同步取得 WebApi 的結果,在宣告回傳數值前要加上 async,並且回傳數值要用 Task 包起來,說明這是個數值是非同步取得的結果,於接收值端前面要加上 await 前綴參考,表示暫停執行方法,直到等候的工作完成。所以在程式中要引用參考:using System.Threading.Tasks;
在接著非同步取得回來的 Json 字串要轉成類別形式,需要用到 JsonConvert 的方法,所以要在 NuGet 下載 Json.NET 外掛:
程式中要再引用參考:
using Newtonsoft.Json; using Newtonsoft.Json.Linq;
3.
在 Index 的 Function 中完整程式碼:public async Task<ActionResult> Index() { response = await client.GetAsync("api/RMS/CompanyApi/"); string t_s = await response.Content.ReadAsStringAsync(); var rms_company = JsonConvert.DeserializeObject<List<RMS_Company>>(t_s); return View(rms_company); }
在 Details 的 Function 中完整程式碼:
public async Task<ActionResult> Details(Guid? id = null) { response = await client.GetAsync("api/RMS/CompanyApi/" + id); string t_s = await response.Content.ReadAsStringAsync(); var rms_company = JsonConvert.DeserializeObject<RMS_Company>(t_s); if (rms_company == null) { return HttpNotFound(); } return View(rms_company); }
在 Create 的 Function 中完整程式碼:
[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Create(RMS_Company rms_company) { if (ModelState.IsValid) { setContent(JsonConvert.SerializeObject(rms_company)); response = await client.PostAsync("api/RMS/CompanyApi", content); // db.RMS_Company.Add(rms_company); // db.SaveChanges(); return RedirectToAction("Index"); } return View(rms_company); }
在 Edit 的 Function 中完整程式碼:
public async Task<ActionResult> Edit(Guid? id = null) { // RMS_Company rms_company = db.RMS_Company.Find(id); response = await client.GetAsync("api/RMS/CompanyApi/" + id); string t_s = await response.Content.ReadAsStringAsync(); var rms_company = JsonConvert.DeserializeObject<RMS_Company>(t_s); if (rms_company == null) { return HttpNotFound(); } return View(rms_company); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Edit(RMS_Company rms_company) { if (ModelState.IsValid) { rms_company.Updater = Guid.NewGuid(); rms_company.UpdateOn = DateTime.Now; setContent(JsonConvert.SerializeObject(rms_company)); response = await client.PutAsync("api/RMS/CompanyApi/" + rms_company.CompanyId, content); // db.Entry(rms_company).State = EntityState.Modified; // db.SaveChanges(); return RedirectToAction("Index"); } return View(rms_company); }
在 Delete 的 Function 中完整程式碼:
public async Task<ActionResult> Delete(Guid? id = null) { // RMS_Company rms_company = db.RMS_Company.Find(id); response = await client.GetAsync("api/RMS/CompanyApi/" + id); string t_s = await response.Content.ReadAsStringAsync(); var rms_company = JsonConvert.DeserializeObject<RMS_Company>(t_s); if (rms_company == null) { return HttpNotFound(); } return View(rms_company); } [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<ActionResult> DeleteConfirmed(Guid id) { // RMS_Company rms_company = db.RMS_Company.Find(id); response = await client.DeleteAsync("api/RMS/CompanyApi/" + id); // db.RMS_Company.Remove(rms_company); // db.SaveChanges(); return RedirectToAction("Index"); }
沒有留言 :
張貼留言