【问题标题】:Generate raw json array into view in ASP.NET MVC在 ASP.NET MVC 中生成原始 json 数组到视图中
【发布时间】:2010-11-03 08:36:14
【问题描述】:

我正在使用 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 的东西?

【问题讨论】:

    标签: javascript asp.net-mvc json


    【解决方案1】:

    您似乎遇到了编码问题。我相信你在这里有两个选择:

    1. 创建扩展程序时,请确保它返回 MvcHtmlString 而不是普通的 string,或者...
    2. 不要使用&lt;%: ... %&gt; 样式写出您的代码,而是使用&lt;%= ... %&gt; 不进行编码。

    【讨论】:

    • 我可以在我的 razor HTML 文件中使用这行代码:MvcHtmlString.Create(Json.Encode(Model))
    • 没错。到底是MvcHtmlString是它的关键。
    【解决方案2】:

    是的,有一个不错的方法:

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

    MVC 会将集合转换为相关的 JSON。

    这将返回一个 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);
    

    只要listOfInfo的实现了IEnumerable,就会序列化成JSON数组。

    您可能需要稍微调整一下您的视图模型,但这应该会让您走上正确的轨道。

    【讨论】:

    • 我正在寻找第二个选项,将 json 渲染到视图中,没有控制器操作返回 json。我会更新问题以澄清。
    • 感谢您的跟进,尝试了您的方法,但效果不佳。请查看我更新的问题(ToJson 封装了 js.Serialize 调用以将其排除在视图模型之外)
    • 看起来你已经整理好了,我很高兴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2012-08-15
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多