如何从 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.stringify
和JSON.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 中按名称获取值