2013-07-21 32 views
0

我想从我的视图检索我的模型上的颜色字典。但是我得到一个颜色字典无法序列化的错误。在我的模型中,我创建如下列表。传递颜色字典查看MVC

public Dictionary<int, Color> Colourlist = new Dictionary<int, Color>(); 

我在模型

public Dictionary<int, Color> CreateColourPalette() 
     { 
      Colourlist.Add(1, System.Drawing.ColorTranslator.FromHtml("#f2dcdb")); 
      Colourlist.Add(2, System.Drawing.ColorTranslator.FromHtml("#e6b8b7")); 
      Colourlist.Add(3, System.Drawing.ColorTranslator.FromHtml("#da9694")); 
      Colourlist.Add(4, System.Drawing.ColorTranslator.FromHtml("#C20046")); 
      Colourlist.Add(5, System.Drawing.ColorTranslator.FromHtml("#d8e4bc")); 
      Colourlist.Add(6, System.Drawing.ColorTranslator.FromHtml("#c4d79b")); 
      Colourlist.Add(7, System.Drawing.ColorTranslator.FromHtml("#76933C")); 
      Colourlist.Add(8, System.Drawing.ColorTranslator.FromHtml("#b7dee8")); 
      Colourlist.Add(9, System.Drawing.ColorTranslator.FromHtml("#92cddc")); 
      Colourlist.Add(10, System.Drawing.ColorTranslator.FromHtml("#4F81BD")); 
      Colourlist.Add(11, System.Drawing.ColorTranslator.FromHtml("#CCCCFF")); 
      Colourlist.Add(12, System.Drawing.ColorTranslator.FromHtml("#b1a0c7")); 
      Colourlist.Add(13, System.Drawing.ColorTranslator.FromHtml("#711471")); 
      Colourlist.Add(14, System.Drawing.ColorTranslator.FromHtml("#eeece1")); 
      Colourlist.Add(15, System.Drawing.ColorTranslator.FromHtml("#ddd9c4")); 
      Colourlist.Add(16, System.Drawing.ColorTranslator.FromHtml("#c4bd97")); 
      Colourlist.Add(17, System.Drawing.ColorTranslator.FromHtml("#494529")); 
      Colourlist.Add(18, System.Drawing.ColorTranslator.FromHtml("#00AEEF")); 

      return Colourlist; 
     } 

在我这样做的视图中创建的列表这样的,基本上用户点击按钮,它调用这个函数创建一个表,它在JSON的错误.Encode行,当我查看它时,Colourlist会正确填充,但它不会连续出现,我错过了什么?

function createTable() 
     { 

      var num_cols = 0; 
      var headings = new Array(); 
      headings.push("Cost Type"); 
      var colours = @Html.Raw(Json.Encode(Model.Colourlist)); 
      var checkbox = $("input[name=SelectedYears]"); 
      for (var i = 0; i < checkbox.length; i++) { 
       if (checkbox[i].checked) { 
        var chkBoxText = checkbox[i].nextSibling; 
        if (chkBoxText != null) 
         headings.push(chkBoxText.nodeValue); 
       } 
      } 

      var num_cols = headings.length; 
      var theader = '<table border="1">\n'; 
      var tbody = ''; 

      //create heading row 
      tbody += '<tr>'; 
      for (var j = 0; j < headings.length; j++) 
      { 
       tbody += '<td style="margin-right:10px;">'; 
       tbody += headings[j].toString(); 
       tbody += '</td>' 
      } 

      var costtypes = $("input[name=SelectedCostTypes]") 
      tbody += '</tr>\n'; 

      for(var i=0; i<costtypes.length;i++) 
      { 
       if (costtypes[i].checked) { 
        var chkCostTypeText = costtypes[i].nextSibling; 
        if (chkCostTypeText != null) 
        { 
         tbody += '<tr>'; 
         tbody += '<td>'; 
         tbody += chkCostTypeText.nodeValue; 
         tbody += '</td>' 
         tbody += '<td>'; 
         tbody += colours[i]; 
         tbody += '</td>' 
         tbody += '</tr>\n'; 
        } 
       } 
      } 
      var tfooter = '</table>'; 
      document.getElementById('wrapper').innerHTML = theader + tbody + tfooter; 
     } 

这是错误。

Type 'System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Drawing.Color, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]]' is not supported for serialization/deserialization of a dictionary, keys must be strings or objects. 
+0

[这里看看,请(http://stackoverflow.com/questions/11749103/html-rawjson-encode-and-internet-explorer-9) – Ohgodwhy

+0

我很抱歉地说,但你真的需要学习一些JS。你目前写的代码有点可怕。 –

+0

我是JavaScript新手,所以是可能不是最好的,但我认为堆栈溢出是需要帮助的人 – user329540

回答

0

问题是你的字典不能有非字符串键,因为它们不能被javascript正确理解。然而,在你的情况下解决似乎是很简单 - 只是把你的字典到使用数字的字符串表示的关键之一:

public Dictionary<string, Color> Colourlist = new Dictionary<string, Color>(); 

public Dictionary<string, Color> CreateColourPalette() 
{ 
    Colourlist.Add("1", System.Drawing.ColorTranslator.FromHtml("#f2dcdb")); 
    ...