• ASP.NET MVC 4 中 Controller 与 ApiController 做读取、新增、更新、删除 ( CRUD )


     

    在 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");
    }
    
  • 相关阅读:
    docker部署nginx文件服务器
    local variable 'a' referenced before assignment
    函数嵌套的顺序
    动态参数
    函数——函数接收不定个数的数字实参,将数字之和返回给调用者
    函数——函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容,然后将这四个内容传入到函数中, 此函数接收到这四个内容,将内容追加到一个student msg文件中
    函数——此函数只接收一个参数且此参数必须是列表数据类型,此函数完成的功能是返回给调用者一个字典, 此字典的键值对为此列表的索引及对应元素。例如传入的列表为:[11,22,33]返回的字典为{0:11,1:22,2:33}
    函数——检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者
    函数—判断用户传入的对象(字符串、列表、元组)长度是否大于5
    Python中深拷贝与浅拷贝的区别
  • 原文地址:https://www.cnblogs.com/luoxiaoxi/p/5251753.html
Copyright © 2020-2023  润新知