代码改变世界

向mvc controller传递json数组

  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
}
);
 
}

 

经过了这样的调整一切正常了。但是感觉里面有很多要改进的地方,但是实在没有时间再研究了。本人水平尚属初学,有不足的地方望大家指正

编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示