阅读: 961 评论: 9 作者: RoyLiu 发表于 2010-02-27 00:11 原文链接
对于这个主题我没有找到最合适的办法,只是找出了个可以暂时规避问题的方法。发到这里非常希望各位大侠,能给小弟些思路解决此问题。
一开始的需求
本想实现这么一个功能
这里的
var titles = [{ title: "ONE",List: ["1", "2"] }, { title: "TWO", List: ["2","8"] }, { title: "THREE", List: ["3","6"] }, { title: "FOUR", List: ["4","7"] }, { title: "FIVE",List:["4","5"]}]; function sendAjax() { var array = titles[0].List;//做测试,就直接用第一个了 //var data = $.toJSON(array); $.ajax({ url: "/Store/GetData", type: "POST", dataType: 'json', data: {listVar:array,limit:10}, contentType: "application/json", success:DataArrange } ); }
后台的程序
[HttpPost()] public ActionResult GetHotStores(List<String> listVar,int? limit) { //会传回数据并显示 var results=*****; return JSON("results",JsonRequestBehavior.AllowGet); }
这个是我最一开始的程序,刚一开始,发现整个程序怎么也不起作用(可以传到后台),一顿调试,发现时没有把json数据字符串化,后来使用了jqueryToJSON进行了字符串化,
字符串化后,limit可以认出了,但是对于数组格式的listVar始终传来时null,网上遍寻资料。发现再处理数组时候需要加入属性对数据进行预处理。于是自定义了一个属性
public class JsonFilter : ActionFilterAttribute { public string Param { get; set; } public Type JsonDataType { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Request.ContentType.Contains("application/json")) { string inputContent; using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream)) { inputContent = sr.ReadToEnd(); } var jss = new JavaScriptSerializer(); var result = jss.Deserialize(inputContent, JsonDataType); filterContext.ActionParameters[Param] = result; } } }
并加在了后台程序的前面,于是后台程序就变成了
[HttpPost()] [JsonFilter(Param = "listVar", JsonDataType = typeof(List<String>))] public ActionResult GetData(List<String> listVar,int? limit) { //会传回数据并显示 var results=*****; return JSON("results",JsonRequestBehavior.AllowGet); }
此时,继续调试,断点设置在属性内,发现数据传进来了,但是无法被正确解析,经过多方面调试,发现最终需要把程序变成如下形式方可:
总结起来就是,传数组的话就只是传数组,形式如["213","23434"]而不要加其他的什么参数名,不可是{array:["213","23434"]}
,如果,写成这样的话JavaScriptSerializer是无法解析的。因为项目赶进度,我只能先暂时做一定得调整把程序改成了
后台
[HttpPost()] [JsonFilter(Param = "listVar", JsonDataType = typeof(List<String>))] public ActionResult GetData(List<String> listVar) { //会传回数据并显示 var results=*****; return JSON("results",JsonRequestBehavior.AllowGet); }
去掉了limit参数
对于前段
function sendAjax() { var array = titles[0].List;//做测试,就直接用第一个了 var data = $.toJSON(array);//添加的地方 $.ajax({ url: "/Store/GetData", type: "POST", dataType: 'json', data: data,//变成了只是传数组 contentType: "application/json", success:DataArrange } ); }
经过了这样的调整一切正常了。但是感觉里面有很多要改进的地方,但是实在没有时间再研究了。本人水平尚属初学,有不足的地方望大家指正
最新新闻:
· IBM发布第五代X架构 打破X86系统30年技术局限(2010-03-03 22:47)
· 互联网手机业务成香馍馍 上海电信盯牢3G市场(2010-03-03 22:38)
· Twitter信息总量即将突破100亿条大关(2010-03-03 22:34)
· Opera为何无法进一步拓展市场(2010-03-03 21:38)
· Symbian版 Skype登陆诺基亚Ovi Store(2010-03-03 21:04)
编辑推荐:Opera为何无法进一步拓展市场