1. 程式人生 > >.net mvc前臺如何接收和解析後臺的字典型別的資料

.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拿到資料後,每個鍵值對應的資料就可以這樣通過鍵值獲取了,獲取後,具體是哪一組資料,再用下標獲取就可以了。

,繞來繞去還是蠻麻煩的哈,但主要是資料比較複雜。

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

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

 

我的郵箱:[email protected],歡迎指教!