向mvc controller传递json数组
2010-02-27 00:11 AnyKoro 阅读(7257) 评论(11) 编辑 收藏 举报对于这个主题我没有找到最合适的办法,只是找出了个可以暂时规避问题的方法。发到这里非常希望各位大侠,能给小弟些思路解决此问题。
一开始的需求
本想实现这么一个功能
这里的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 } ); } |
后台的程序
1 2 3 4 5 6 7 | [HttpPost()] public ActionResult GetHotStores(List<String> listVar, int ? limit) { //会传回数据并显示 var results=*****; return JSON( "results" ,JsonRequestBehavior.AllowGet); } |
这个是我最一开始的程序,刚一开始,发现整个程序怎么也不起作用(可以传到后台),一顿调试,发现时没有把json数据字符串化,后来使用了jqueryToJSON进行了字符串化,
字符串化后,limit可以认出了,但是对于数组格式的listVar始终传来时null,网上遍寻资料。发现再处理数组时候需要加入属性对数据进行预处理。于是自定义了一个属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } } } |
并加在了后台程序的前面,于是后台程序就变成了
1 2 3 4 5 6 7 8 | [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是无法解析的。因为项目赶进度,我只能先暂时做一定得调整把程序改成了
后台
1 2 3 4 5 6 7 8 | [HttpPost()] [JsonFilter(Param = "listVar" , JsonDataType = typeof (List<String>))] public ActionResult GetData(List<String> listVar) { //会传回数据并显示 var results=*****; return JSON( "results" ,JsonRequestBehavior.AllowGet); } |
去掉了limit参数
对于前段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 } ); } |
经过了这样的调整一切正常了。但是感觉里面有很多要改进的地方,但是实在没有时间再研究了。本人水平尚属初学,有不足的地方望大家指正
作者:AnyKoro
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)