代码之家  ›  专栏  ›  技术社区  ›  soren.enemaerke

在ASP.NET MVC中生成原始json数组

  •  5
  • soren.enemaerke  · 技术社区  · 16 年前

    我使用的是ASP.NET MVC,我试图生成一段javascript作为视图呈现的一部分。我有一个模型,它公开了一个简单类型的数组,我想在视图中生成一个javascript/json等价的数组,这样我就可以使用jQuery对它进行操作。因此,给出以下模型:

    public class Info {
       public string Name {get;set;}
       public int ID {get; set;}
    }
    
    public class InfoModel{
       public Info[] InfoList {get;set;}
    }
    

    …我想生成一个如下所示的javascript数组:

    var infoList = [
          {
             Name = "...",
             ID = 1
          } ,
          {
             Name = "...",
             ID = 2
          },
          ....
          {
             Name = "...",
             ID = N
          }];
    

    在视图中有没有一种简洁的方法来实现这一点,如果我试图让模型生成一个json表示,我似乎在引号的编码上遇到了麻烦,所以目前我只能使用一些意大利面/经典asp代码来生成它,我宁愿用一行代码来代替它。

    编辑:请注意,我不想让控制器返回JsonResult,我想让我的视图包含一个javascript数组,这个数组是从我的模型在一行代码中生成的(如果可能的话)

    我有一部分的方法,但似乎是挣扎在编码。视图中的此代码:

    <script>
    var list = <%: HtmlExtension.ToJson(Model.InfoList) %>;
    </script>
    

    (其中ToJson使用JavaScriptSerializer封装到字符串的转换)输出一些编码错误:

    var info = [{&quot;Name&quot;:&quot;Low End&quot;,&quot;ID&quot;:1}];
    

    …这不是我想要的。我可以这么做:

    var info = <% Response.Write(HtmlExtension.ToJson(Model.InfoList)); %>;
    

    这很管用,但看起来没那么闪亮。我应该显式地忽略编码,如图所示(输出是正常的,不是用户生成的,所以可能不是问题),还是我遗漏了一些其他的东西,使它不太经典的asp?

    2 回复  |  直到 16 年前
        1
  •  5
  •   Jonathan Bates    16 年前

    你好像有编码问题。我相信你有两个选择:

    1. 创建扩展时,请确保它返回 MvcHtmlString 而不是普通的 string ,或。。。
    2. 而不是使用 <%: ... %> 编写代码的样式,使用 <%= ... %> 不进行编码。
        2
  •  1
  •   RPM1984    16 年前

    是的,有一个很好的方法:

    InfoModel viewModel; // get this from wherever
    return Json(viewModel);
    

    这将返回 JsonResult公司 (即原始JSON)。

    这就是你想要的吗?

    如果你想在你看来做这样的事情:

    <script type="text/javascript>
       var json = <%: Model.JsonStuff %>
       // more js
    </script>
    

    那么上面的例子就行不通了。

    在构建ViewModel时,必须手动序列化它。

    编辑

    下面是一个如何序列化数据的示例。

    JavaScriptSerializer js = new JavaScriptSerializer();
    var listOfInfos; // this will be a collection (e.g List) of Infos.
    var viewModel = new InfoModel
                    {
                       InfoList = js.Serialize(listOfInfos);
                    };
    return View(viewModel);
    

    只要 实现IEnumerable,它将序列化为JSON数组。