我试图从我的视图中检索我的模型上的颜色字典。 但我得到的错误是颜色词典无法序列化。 在我的模型中,我创建如下列表。
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.I am trying to retrieve a dictionary of colours on my model from my view. But I am getting an error that the dictionary of colours can't be serialized. In my model I create the list as follows.
public Dictionary<int, Color> Colourlist = new Dictionary<int, Color>();I create the list like this in the model
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; }In the view I do the following, basically user clicks button and it calls this function which creates a table, it errors on the Json.Encode line, the Colourlist is populated correctly when I view it but it won't serialise, what am I missing?
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; }This is the error.
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.最满意答案
问题是你的字典不能有非字符串键,因为javascript无法正确理解它们。 但是在你的情况下修复似乎很简单 - 只需将你的字典变成一个使用字符串表示数字作为键的字典:
public Dictionary<string, Color> Colourlist = new Dictionary<string, Color>(); public Dictionary<string, Color> CreateColourPalette() { Colourlist.Add("1", System.Drawing.ColorTranslator.FromHtml("#f2dcdb")); ...The problem is that your dictionary cannot have non-string keys because they won't be understood correctly by javascript. However fix in your case seems to be simple enough - just turn your dictionary into one that uses string representation of numbers as keys:
public Dictionary<string, Color> Colourlist = new Dictionary<string, Color>(); public Dictionary<string, Color> CreateColourPalette() { Colourlist.Add("1", System.Drawing.ColorTranslator.FromHtml("#f2dcdb")); ...更多推荐
发布评论