通过MVC和RAZOR编写JSON

Eel*_*Fan 3 javascript razor

我有一个ASP.NET MVC 4应用程序.这个应用程序有一个视图与页脚中的javascript块.我正在使用RAZOR视图引擎.我试图弄清楚如何将我的结果集转换为JSON数组.目前,我正在做以下事情:

<script type="text/javascript">
@for (int i=0; i<ViewBag.States.Count; i++) {
    <text>
        { id: @Html.Raw(ViewBag.States[i]["ID"], name: \"" + ViewBag.States[i]["Name"] + "\"}")
    </text>
    if (i < (ViewBag.States.Count - 1)) {
        <text>,</text>
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

这种方法在语法上似乎很草率.但是,我不知道怎么做.有谁知道我怎么能清理它?通过这种方法,我甚至无法弄清楚如何将"ID"值包装在引号中.

It'*_*lex 6

我知道这个问题已经在一年多前回答了,但我想添加我的解决方案,这是最干净的.

我基本上做的是这个(使用Newtonsofts Json.Net).我已经为HtmlHelper类创建了一个扩展方法,如下所示:

public static class HtmlHelperExtensions
{
    public static HtmlString ToJson(this HtmlHelper @this, object value)
    {
        return new HtmlString(JsonConvert.SerializeObject(value));
    }

    public static HtmlString ToJson(this HtmlHelper @this, object value, Formatting formatting)
    {
        return new HtmlString(JsonConvert.SerializeObject(value, formatting));
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我做到了:

$scope.test = @(Html.ToJson(new []
                    {
                        new {id='1',name="Hello", desc="World"},
                        new {id='1',name="Hello", desc="World"},
                        new {id='1',name="Hello", desc="World"}
                    }));
Run Code Online (Sandbox Code Playgroud)

结果如下:

$scope.test = [{"id":"1","name":"Hello","desc":"World"},{"id":"1","name":"Hello","desc":"World"},{"id":"1","name":"Hello","desc":"World"}];
Run Code Online (Sandbox Code Playgroud)

基本上你的例子会变成:

@(Html.ToJson(ViewBag.States.Select(s=>new {id=s["ID"], name=s["Name"]})))
Run Code Online (Sandbox Code Playgroud)

要么

@(Html.ToJson(
    from state in ViewBag.States
    select new {id=state["ID"], name=state["Name"]}))
Run Code Online (Sandbox Code Playgroud)