传递颜色字典以查看MVC(Passing dictionary of colours to view MVC)

编程入门 行业动态 更新时间:2024-10-25 10:26:48
传递颜色字典以查看MVC(Passing dictionary of colours to view 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.

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")); ...

更多推荐

本文发布于:2023-07-25 22:38:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1267233.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字典   颜色   MVC   Passing   colours

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!