如何从 JavaScript 中的 Razor 模型对象获取 JSON 对象

Posted

技术标签:

【中文标题】如何从 JavaScript 中的 Razor 模型对象获取 JSON 对象【英文标题】:How to get JSON object from Razor Model object in javascript 【发布时间】:2014-12-08 06:14:22 【问题描述】:

在viewmodel对象中,属性如下:

  public IList<CollegeInformationDTO> CollegeInformationlist  get; set; 

在VIEW中,javascript如下:

   var obj = JSON.stringify('@Model.CollegeInformationlist');
   alert(obj[1].State);  //NOT WORKING, giving string char

      $.each('@Model.CollegeInformationlist', function (i, item) 
    var obj = JSON.stringify(item);
    var r = $.parseJSON(obj);
    alert(r.State);    //just giving undefined.
    );

请在此处指导,我如何在 javascript 中获取 JSON 对象。

【问题讨论】:

您的 javascript 不知道您的 CollegeInformationDTO 类是什么样的。在我的上一份工作中,我们在脚本中定义了一个与模型具有相同结构的对象,然后使用 jquery .map 将模型映射到 javascript 对象。还要确保您传递给视图的是 JSON 字符串 您需要将模型对象序列化为 JSON。您应该创建一个返回该结果的方法(或属性)。 你能分享一些东西给我吗?在这里,我写了 var obj = JSON.stringify('@Model.CollegeInformationlist'); 所以,它应该转换为 JSON 对象,并且能够在显式写入 .State 属性时给出结果,但是它不像一种方式工作。看起来,OBJECT 被转换成字符串类型了。 【参考方案1】:

您可以使用以下内容:

var json = @html.Raw(Json.Encode(@Model.CollegeInformationlist));

这将输出以下内容(没有看到您的模型,我只包含了一个字段):

<script>
    var json = ["State":"a state"];   
</script>

Working Fiddle

AspNetCore

AspNetCore 使用 Json.Serialize 而不是 Json.Encode

var json = @Html.Raw(Json.Serialize(@Model.CollegeInformationlist));

MVC 5/6

您可以为此使用 Newtonsoft:

    @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model, 
Newtonsoft.Json.Formatting.Indented))

这使您可以更好地控制 json 格式,即如上所述的缩进、驼峰等。

【讨论】:

我找不到 JSON 引用,得到一个错误为 The name 'Json' does not exist in the current context 如果我添加,Newtonsoft.Json. 然后,Encode 找不到。 对于任何使用 AspNetCore 的人,使用 Json.Serialize 而不是 Json.Encode 对于较新版本的 MVC 5/6 @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model, Newtonsoft.Json.Formatting.Indented)) @R2D2 对您的建议进行了补充:JsonConvert.SerializeObject(Model, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings ContractResolver = new CamelCasePropertyNamesContractResolver() ) 这也确保了序列化 JSON 的正确 JavaScript CamelCase(或者我应该说camelCase)。 @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model, Newtonsoft.Json.Formatting.Indented)) 为我工作【参考方案2】:

在 ASP.NET Core 中,IJsonHelper.Serialize() 返回 IHtmlContent,因此您无需通过调用 Html.Raw() 来包装它。

应该很简单:

<script>
  var json = @Json.Serialize(Model.CollegeInformationlist);
</script>

【讨论】:

【参考方案3】:

使用后代码var json = @Html.Raw(Json.Encode(@Model.CollegeInformationlist));

你需要使用JSON.parse(JSON.stringify(json));

【讨论】:

小事,但你应该在第二行格式化你的代码段。编辑太小了,所以我不会这样做。 你为什么要一个接一个地JSON.stringifyJSON.parse?它不会被需要并且会浪费资源。 有道理。我需要测试是否在没有 JSON.stringify 的情况下工作。我认为只有JSON.parse(@Html.Raw(Json.Encode(@Model.CollegeInformationlist))) 应该可以工作。有人可以测试并让我们知道。但现在我使用这种方式并为我工作。【参考方案4】:

如果您想从您的模型中创建 json 对象,请这样做:

  foreach (var item in Persons)
   
    var jsonObj=["FirstName":"@item.FirstName"]
   

或者使用Json.Net从你的模型中生成json:

string json = JsonConvert.SerializeObject(person);

【讨论】:

【参考方案5】:

将对象从控制器传递到视图,将其转换为不编码的标记,并将其解析为json。

@model IEnumerable<CollegeInformationDTO>

@section Scripts
    <script>
          var jsArray = JSON.parse('@Html.Raw(Json.Encode(@Model))');
    </script>

【讨论】:

为什么要把结果用引号和JSON.parse 一个接一个地括起来?它不会被需要并且会浪费资源。【参考方案6】:

以下代码对我有用

var chartD =  JSON.parse(JSON.stringify([@Json.Serialize(@Model)]));

【讨论】:

以上是关于如何从 JavaScript 中的 Razor 模型对象获取 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

从模型中的嵌套对象获取 MVC4/Razor 中 JavaScript 的元素 id

使用 Jquery 从 Razor 视图中的网格表中以模态显示整个字典

如何使用 Razor 视图引擎在 JavaScript 中正确混合 C# 代码。我希望根据 ViewBag 中的值包含或省略 Javascript

如何在 GridPanel Ext.net Razor 中按名称获取值

MVC 3 Razor 视图:从布尔模型值生成 JavaScript

在 razor 代码中使用 javascript/jquery