ASP.NET MVC 4 中 Controller 與 ApiController 做讀取、新增、更新、刪除 ( CRUD )

來源:互聯網
上載者:User

標籤:

 

在 ASP.NET MVC 4 架構上,WebApi ( ApiController ) 較適合做資料處理與提供的動作,而 MVC 4 Web ( Controller ) 內比較要配合 View 層資料顯示而做異動,這時候如果要把 ApiController 和 Controller 切開來,那這兩個部分的溝通就會很常使用了。如果你是用 MVVM 的架構,在 Model-View View-Model 這兩段,若是一頁搜集各資料表的某些資料,那在 View 那一段就必須要與 WebApi 溝通多次才能將資料湊齊,再加上關聯資料,那就更複雜了,另外一點,如果各個 WebApi 的 Url 寫在頁面上,可能會有資安的危險,因為 WebApi 是開放的資料,如果不是任何人都能存取,那就不能玩 MVVM 的架構了。

在 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");}

ASP.NET MVC 4 中 Controller 與 ApiController 做讀取、新增、更新、刪除 ( CRUD )

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.