前言:这段时间一直在学习新东西,今天抽时间来记录一下。这两天碰到一个bug,
前端向WebService和Asp.Net MVC发送的请求数据一毛一样,两个后台处理出来的数据就是不一样。花了一天时间才搞定,好TM坑爹呀,原因就是WebService和Asp.Net MVC接收到的参数不同,下面会详细对比记录。
本文主要记录三个问题:
1.WebService和Asp.Net MVC接收到参数不一致的问题
2.Asp.Net MVC 取用(area)路由配置中和命名空间的问题
3.
Newtonsoft.Json序列化和反序列化问题
一、
WebService和Asp.Net MVC接收到参数不一致的问题
对比之后,发现了第二次其实是进行了二次序列化,记录一下,后面如果使用的话,需要注意。 解决办法就是不能直接把反序列化的结果sdjs进行序列化,而应该把sdjs.Result进行序列化,因为sdjs.Result才是我们最开始序列的对象。
首先我们回顾一下,当我们用ashx文件接收前段传过来的参数时,我们接收到的参数都是string类型,而后端方法参数不可能全部都用string,所以我们需要把string类型转为我们需要的类型,比如int bool double,这些都属于简单类型,转换很方便,但是如果我们需要的是一个T型list(也就是泛型列表),T代表任意简单类型或者自定义类型,这时转换就很麻烦了。然而幸运的是,WebService和Asp.Net MVC都可以吧接收到的参数进行转换,为我们省去了很多步骤。
首先来看后代代码
C# Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/// /// WebService /// /// [WebMethod(Description = "获取一些表的数据" )] public string GetDataByPage( string tbid, List conditions, bool onlyCanShow, bool hasKey, int size, int index, string SYS_ID) { return _mAsmx.GetDataByPage(tbid, conditions, onlyCanShow, hasKey, size, index, SYS_ID); } /// /// MVC /// public ActionResult GetDataByPage( string tbid, List conditions, bool onlyCanShow, bool hasKey, int size, int index, string SYS_ID) { object dt = mi.GetDataByPage(tbid, conditions, onlyCanShow, hasKey, size, index, SYS_ID); string dobject = new SerializeJson<</span>object>(ResultType.succeed, "", dt).ToString(); Dictionary<</span>object, object> obj = new Dictionary<</span>object, object>(); obj.Add("d", dobject); return Json(obj, JsonRequestBehavior.AllowGet); } |
然后我们再看看接收到的参数
图中函数的第二个参数ConditionClass是一个自定义类型,我们从前端传过来的都是空数组“[]”,然而WebService接收到空数组以后创建了一个空对象,而MVC却给了一个null值,就是这小小的不同,导致我们后端出来的结果不同。
解决办法是:判断一下是否为null,为null就自己new一个出来
if (conditions is null) conditions = new List();
二、
Asp.Net MVC 区域(area)路由配置中和命名空间的问题
从Asp.Net MVC4开始,支持采用区域,即一个大的MVC项目其中可以包含很多小的MVC,这样一来,每个小区域可以独立开发,分工明确又互相协同。但这样一来,每个区域都要进行路由配置,有时候会混淆,下面详细说明。
注意我们用红线框起来的,我们来看下他是什么
就是他的Controller的命名空间,记住这个对应关系,以后就不会错了。
三、
Newtonsoft.Json序列化和反序列化问题
关于
Newtonsoft.Json,他是一个dll文件,也就是引用文件,前端用到的数据通常是json格式,而这个文件就是后端用来把数据序列化城json的,这两天用这个文件进行了序列化和反序列化,发现了一个有趣的问题。看图
上面,我们通过调用GetDataByPage分页方法,得到了一个序列化后的值,为了知道这个值得原型是什么,我么又进行了一次反序列化,把反序列化的结果又进行了一次序列化,对比两次的序列化结果,竟然不一样,为了知道为什么,我们把两次得到的json分别进行了格式化
第一个json:
第二个json:
对比之后,发现了第二次其实是进行了二次序列化,记录一下,后面如果使用的话,需要注意。 解决办法就是不能直接把反序列化的结果sdjs进行序列化,而应该把sdjs.Result进行序列化,因为sdjs.Result才是我们最开始序列的对象。
好了,本次博文就分享到这里,路漫漫其修远兮,最近状态还是不好,现在备战软考,明年备注注册测绘师,加油。