如题,前端终归接触的是展示层的数据,倘若按照 mvc 模式划分的话,仅仅是一个 v 层面而已,这样是不利于全局发展和培养大局观的,总是要走出舒适圈的,今天我们就来尝试一下,走出 js 的舒适圈。
业务中我们可能会碰到这样一个需求,就是点击新增后往一个表格中添加数据,点击新增按钮后首先会出现一个弹窗,然后弹出一个可以多选的网格弹窗,用户在选择一条或者几条数据后点击确定,然后将数据添加进明细表即可,但是此时因为业务需求,新增弹窗所提供的数据不够详细,于是我们就需要在用户选择完数据后,在点击选择按钮后继续去调用一个后台接口,将所选的数据以数组方式传递给后台,让后台对数据尽心加工后再返回给我们,之前也没太关注这里,就是草草编写了业务逻辑,真要问我为什么调用这个接口,我只能像上面说的,大致描述缺少字段,具体缺少那些字段,为什么缺少,我是一点答不上来。今天我们就重点去看看这个接口到底干了什么。
首先打断点,我们知道,这个接口名字叫做
GetMoveLineForPdaAdd,系属于stock_ItemMoveService控制器,然后我们可以在后台项目中全局搜索这个GetMoveLineForPdaAdd,
不出意外,就会搜索到这段代码
碰到 c# 代码了,但是不要慌,毕竟我们也是有几年 js 功底的,我们就来分析下这段代码都干了什么。其实总体来说类似于我们 js 中经常写的方法,也是用来给大家调用的。
首先:
[HttpPost]
这个不用过分纠结,大致可以理解为这些方法要分类别,大致分为 get 和 post 两大类,加入 [HttpPost] 代表着属于 post 类别,必须用 post 方式才能调用,同理还有 [HttpGet]
然后:
public ApiResponseContent GetMoveLineForPdaAdd(JObject jo)
可以理解为定义一个方法,方法名字叫做 GetMoveLineForPdaAdd ,支持传参 jo。
再然后:
string errMsg = string.Empty;
代表着初始化一个变量 errMsg,然后默认初始值为 null。
其次:
if (jo == null)
return Fail("传入参数为空!");
对所传参数 jo 进行非空校验。
再其次:
if (jo["data"] == null)
return Fail("传入data不能为空!");
这里,我们得出,jo是个对象,里面必定有 data 属性,并且对 data 也会进行非空校验。
继而:
var userInfo = CurrentUser;
定义了一个局部变量 userInfo 用来缓存全部变量 CurrentUser。
再次:
if (userInfo.EmpId == null)
{
return Fail("登录过期,请重新登录!");
}
对刚刚缓存的 userInfo 判断其 EmpId属性是否为空,若为空,则提示用户登录过期
关键的来了:
var result = Stock_ItemMoveOperate.GetMoveLineForPdaAdd(JsonConvert.DeserializeObject<List<V_BasicItem_ItemViewDTO>>(jo["data"].ToString()),out errMsg)
这里我们知道,我们传给后台的数据并不是在这里处理加工的,而是又被转手到了这个方法里面,接着我们选中方法,按 f12 跟进去。
跟进去之后,会看到一个大致这样的方法,而这个方法,也就确确实实向我们展示了后台处理这个业务的详细逻辑。
这个时候我们其实可以大致总结下:
该段代码通过将所传的数据获取到库存数据,在对该库存数据进行遍历时进行了业务数据的赋值,最后将得到的数据返回,最终成功得到了修正过后的完整库存数据。
最后:
return string.IsNullOrEmpty(errMsg) ? Success(result) : Fail(errMsg);
判断是否报错,若没有报错,则返回最终数据,若报错,则返回报错信息