博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC 4 中 Controller 与 ApiController 做读取、新增、更新、删除 ( CRUD )
阅读量:6478 次
发布时间:2019-06-23

本文共 4290 字,大约阅读时间需要 14 分钟。

 

在 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
Index(){ response = await client.GetAsync("api/RMS/CompanyApi/"); string t_s = await response.Content.ReadAsStringAsync(); var rms_company = JsonConvert.DeserializeObject
>(t_s); return View(rms_company);}

在 Details 的 Function 中完整程序代码:

public async Task
Details(Guid? id = null){ response = await client.GetAsync("api/RMS/CompanyApi/" + id); string t_s = await response.Content.ReadAsStringAsync(); var rms_company = JsonConvert.DeserializeObject
(t_s); if (rms_company == null) { return HttpNotFound(); } return View(rms_company);}

在 Create 的 Function 中完整程序代码:

[HttpPost][ValidateAntiForgeryToken]public async Task
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
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
(t_s); if (rms_company == null) { return HttpNotFound(); } return View(rms_company);}[HttpPost][ValidateAntiForgeryToken]public async Task
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
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
(t_s); if (rms_company == null) { return HttpNotFound(); } return View(rms_company);}[HttpPost, ActionName("Delete")][ValidateAntiForgeryToken]public async Task
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");}

转载于:https://www.cnblogs.com/luoxiaoxi/p/5251753.html

你可能感兴趣的文章
iOS自定制tabbar与系统的tabbar冲突,造成第一次点击各个item图片更换选中,第二次选中部分item图片不改变...
查看>>
SVN服务器使用(二)
查看>>
反射获取内部类以及调用内部类方法
查看>>
App里面如何正确显示用户头像
查看>>
U-BOOT之一:BootLoader 的概念与功能
查看>>
我的路上
查看>>
Velocity处理多余空白和多余空白行问题
查看>>
DB2与oracle有什么区别
查看>>
创建一个多级文件目录
查看>>
Picasa生成图片幻灯片页面图文教程
查看>>
svn status 显示 ~xx
查看>>
常用HiveQL总结
查看>>
[转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
查看>>
POJ 3311 Hie with the Pie(状压DP + Floyd)
查看>>
Security updates and resources
查看>>
DNS为什么通常都会设置为14.114.114.114
查看>>
Sqoop架构(四)
查看>>
golang copy函数
查看>>
《你有多少问题要请示》精华集粹
查看>>
打印图片
查看>>