Передача словаря из контроллера в Javascript

У меня есть модель вида, как это:

public class weightdata
{
    ...some properties
    public string weights;
}

Тогда у меня в контроллере:

weightdata details = new weightdata();
Dictionary<string,float> dict = new Dictionary<string,float>();
//do something to fill the dictionary with values
var ser = new System.Web.Script.Serialization.JavaScriptSerializer();
details.weights = ser.Serialize(dict);
return View(details);

Тогда в представлении:

 <script type="text/javascript">

    var dict = @{Html.Raw(new JavaScriptSerializer().Deserialize<Dictionary<string,float>>(Model.Weights));}
 </script>

Но рендеринг страницы: var dict = (это пусто)

Как я могу получить этот словарь значений туда, где он может быть использован JavaScript?

1 ответ

Ваша собственность уже сериализована, то есть это уже JSON. Вы не хотите десериализовать это в представлении, просто напишите это непосредственно:

var dict = @Html.Raw(Model.Weights);

Другой альтернативой является сделать вашу собственность Dictionary<string, float> вместо строки вы можете сериализовать ее в представление:

 var dict = @Html.Raw(new JavaScriptSerializer().Serialize(Model.Weights));

Что-то, о чем я только что прочитал, может сделать ваш взгляд немного чище - вы можете фактически сбросить JSON в свой собственный script пометить с type="application/json"и ссылаться на него в JavaScript. Это может сделать ваш редактор немного счастливее, поскольку легче отделить javascript от кода C#.

Что-то вроде:

<!-- assuming your Weights property is the serialized JSON string -->
<script id="some-json" type="application/json">
    @Model.Weights
</script>
<script type="text/javascript">
    var dict = JSON.parse(document.getElementById("some-json").innerHTML);
</script>

Просто убедитесь, что вы ориентируетесь на IE8+ или настоящий браузер - если вам нужна поддержка IE7, вам понадобится что-то вроде json2.js.

Другие вопросы по тегам