将C#数据结构传递给javascript

时间:2014-03-21 18:08:01

标签: c# javascript asp.net-mvc-3 razor

这是我的javascript,下面是我的C#代码:

    //javascript in view
    var data = {
        labels: [@Misc.printData(Model.chartLabels, true)],
        datasets: [
            {
                fillColor: "rgba(151,187,205,0.5)",
                strokeColor: "rgba(151,187,205,1)",
                data: [@Misc.printData(Model.chartData, false)]
            }
        ]
    }

    //C# helper
    public static IHtmlString printData(IEnumerable<string> data, bool putQuotes)
    {
        string str = String.Empty;

        if (!data.Any())
            return new HtmlString(str);

        if (putQuotes)
            str = @"""" + data.Aggregate((result, next) => result + @""", """ + next) + @"""";
        else
            str = data.Aggregate((result, next) => result + ", " + next);

        return new HtmlString(str);
    }

我正在尝试使用控制器传递给我的C#模型中的信息来填充javascript中的数据结构。这显然是一个可怕的黑客。有没有更好的方法呢?

3 个答案:

答案 0 :(得分:1)

有一个非常好的名为Json.Net的库,您可以使用它来将.Net对象序列化为Json:

Json.Net

答案 1 :(得分:1)

使用JSON.NET(可通过NuGet获得),您可以在Razor视图中执行此操作:

@Html.Raw(Newtonsoft.Json.Linq.JToken.FromObject(Model).ToString()))

这将写出Model对象的JSON表示。这当然可以封装在辅助函数中,因此不难阅读。

要匹配您的示例,您可以这样做:

var data = {
    labels: @Html.Raw(Newtonsoft.Json.Linq.JToken.FromObject(Model.chartLabels).ToString())),
    datasets: [
        {
            fillColor: "rgba(151,187,205,0.5)",
            strokeColor: "rgba(151,187,205,1)",
            data: @Html.Raw(Newtonsoft.Json.Linq.JToken.FromObject(Model.chartData).ToString()))
        }
    ]
}

答案 2 :(得分:0)

将其作为JSON传递。这是最好的方法。