.net mvc前台如何接收和解析后台的字典類型的數據


  很久沒有寫博客了,最近做了一個公司門戶網站的小項目,其中接觸到了一些我不會的知識點,今日事情少,便記錄一下,當時想在網上搜索相關的內容,但是沒有找到。

  今天想記錄一下這樣一個小的需求的做法。先說一下我的想法:因為是一個門戶網站,所以我需要從后台傳大量的數據到前台,我考慮的是這樣做,用一個字典類型(dictionary<,>)的變量,把數據的類型(比如新聞,公司產品,技術特點,公司簡介)等等作為字典的鍵值,而把相關的數據放到一個List<T>集合里,然后把集合的內容作為鍵值對應的value,想這樣傳遞到前台來。這樣的一個字典數據就比較的復雜了,我后台都做好了,前端也能接收到數據,但不知道怎么把這些數據一一拿出來,在網上查了很多資料,但問題沒有解決,后來知道公司的一個前輩曾把一個字典數據通過web api傳遞給app端,借鑒了一下他的方法,最終達到了我的目的。

  事先聲明,本篇博客我只會把關鍵代碼貼上,而不會寫一個完整的demo,因為那樣會增加很多不必要的內容。

首先把后台的代碼貼出來看看:

 [HttpPost] public ActionResult GetData() { try { //聲明一個字典變量
                Dictionary<string,List<object>> dictionary = new Dictionary<string,List<object>>(); //獲取輪播圖圖片類型id
                var ImageType = context.DicItems.FirstOrDefault(x => x.Name == "主頁輪播圖").Id; var BanImage = context.ManageImages.Where(m => m.ParentId == ImageType && m.IsDelete == false).OrderByDescending(m => m.UploadTime).ToList(); var BanImageData = BanImage.Select(x => new { x.Id, x.ImageTitle, x.ImageUrl }).ToList().Cast<object>().ToList(); //將輪播圖信息添加到字典中
                dictionary.Add("BanImage", BanImageData); //技術特色
                var technology = context.Technologies.Where(x => x.IsDelete == false).OrderByDescending(x => x.CreateTime); var TechnologyData = technology.Select(x => new { x.Id, x.TechName, x.CoverImage }).ToList().Cast<object>().ToList(); dictionary.Add("Technology", TechnologyData); return Json(new { Data = dictionary, Result = true }); } catch (Exception exception) { return Json(new { Result = false, exception.Message }); } }

 

本段代碼,我首先聲明了一個字段類型的變量:

 Dictionary<string,List<object>> dictionary = new Dictionary<string,List<object>>();

 然后用ef操作數據庫獲取了一些數據,並將數據存到List<T>集合中:

 var technology = context.Technologies.Where(x => x.IsDelete == false).OrderByDescending(x => x.CreateTime);//context是聲明的上下文,代碼中未貼出 var TechnologyData = technology.Select(x => new { x.Id, x.TechName, x.CoverImage }).ToList().Cast<object>().ToList();

 

第三步,把數據添加到字典中:

dictionary.Add("Technology", TechnologyData);

 

前面是鍵(key),后面是值(value),有關字典類型不清楚的可百度,此處不做說明。

以json格式像前台回傳數據:

 return Json(new { Data = dictionary, Result = true });

 

傳過去的數據應該為如下一種格式:

{ "key1":[ {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....} ], "key2":[ {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....} ], ..... }

 

每個key下面的值可用下標獲取,像這樣:key1[2].name,key2[1].Id.

哈哈,這其實就是json格式,我太外行了,所以折騰很久也不知道怎么弄。

好了,現在說一下前台接收數據:

先貼出代碼看看:<script type="text/javascript">

   $(document).ready(function(){   query();   });     
    
     var allData = {};

var query = function () { $.ajax({ type: 'post', url: "@Url.Action("GetData","Home")", dataType: 'json', success: function (data) { // alert(data.Message); if (data.Result) { allData = getData(data.Data); var BanImageData = allData["BanImage"]; for (var i = 0; i <= 3; i++) { var ImageId = "BanImage_" + i; alert(BanImageData[i].ImageUrl); $("#" + ImageId).attr("src", BanImageData[i].ImageUrl); } } } }); } var getData = function (data) { var source = {}; for (var item in data) { //item即為鍵值 //source[item]為一個鍵值對應的list集合的值 source[item] = data[item]; } return source; }

 

在ajax里面,首先向后台發送數據請求,然后程序才運行到之前的后台代碼,當后台把這個數據回傳到前台來的時候,由這個data接收,這個data就包含兩個值,一個交Result ,另一個交Data,但是這個data.Data數據真的有點復雜,不是像data.Result那樣是個單數據,就是這里卡主我了。

后來是這樣來做的:主要看下面這段代碼:

    var getData = function (data) { var source = {}; for (var item in data) { //item即為鍵值 //source[item]為一個鍵值對應的list集合的值
            source[item] = data[item]; } return source; }

 

這個函數在上面運行起來就是這樣的:getData(data.Data);

{}是js中的對象類型,

for(var item in data) 就把字典里的每一組數據遍歷一遍,然后把對應的鍵值和數據保存到source{}對象中。然后就是常規操作讀取數據了。

 allData = getData(data.Data); var BanImageData = allData["BanImage"]; for (var i = 0; i <= 3; i++) { var ImageId = "BanImage_" + i; alert(BanImageData[i].ImageUrl); $("#" + ImageId).attr("src", BanImageData[i].ImageUrl); }

 

allData拿到數據后,每個鍵值對應的數據就可以這樣通過鍵值獲取了,獲取后,具體是哪一組數據,再用下標獲取就可以了。

,繞來繞去還是蠻麻煩的哈,但主要是數據比較復雜。

好了,就記錄到這里啦,馬上是元旦了,祝大家開心跨年咯!

本人菜鳥一個,要是有啥出錯的,望指出哦,覺得我寫的差的,接受輕輕的噴,惡意嘲諷謾罵者快走不送哦。

 

我的郵箱:3074596466@qq.com,歡迎指教!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM