向mvc controller傳遞json數組


閱讀: 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
}
);

}

 

經過了這樣的調整一切正常了。但是感覺里面有很多要改進的地方,但是實在沒有時間再研究了。本人水平尚屬初學,有不足的地方望大家指正

評論: 9 查看評論 發表評論

找優秀程序員,就在博客園


最新新聞:
· 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為何無法進一步拓展市場

網站導航:博客園首頁  個人主頁  新聞  閃存  小組  博問  社區  知識庫


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com