使用 Html.Raw 将 ASP.NET 模型序列化为 JSON 的 Razor 语法错误

Posted

技术标签:

【中文标题】使用 Html.Raw 将 ASP.NET 模型序列化为 JSON 的 Razor 语法错误【英文标题】:Razor syntax error serializing ASP.NET Model to JSON with Html.Raw 【发布时间】:2013-07-11 03:14:09 【问题描述】:

这一行在 Visual Studio 2012 中给我一个语法错误(字面意思是“语法错误”):

var data = @html.Raw(new System.Web.Script.Serialization.javascriptSerializer().Serialize(Model));

Model 在这种情况下是 @model MyApp.ViewModels.MyViewModel 在我的 cshtml 顶部声明的实例。

我的模型已正确序列化为数据变量,并且应用程序正常工作。在我的错误列表中永久显示错误只是从外观上看很烦人。

我应该如何修改该行以使编译器满意?

编辑:

根据要求,提供更多上下文。这是整个$(document).ready()

<script type="text/javascript">

    $(document).ready(function () 

        $('#ReportDate').datepicker();
        $('#DispositionDate').datepicker();

        var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));

        var vm = new NonconformingProductViewModel(data);
        ko.applyBindingsWithValidation(vm);

        // validate on page load so all reqd fields are highlighted.
        var valid = ko.validation.group(vm, deep: true);
        valid.showAllMessages(true);

    ); // end document.ready

</script>

【问题讨论】:

“模型”是类/命名空间还是某物的实例? @Tom,您能否发布更多上下文(例如,该代码前后出现的两到三行)? 更新了问题以提供更多上下文。 虽然它说系统税错误但仍然有效。我认为这是VS的错误。如果你想要好的编译。你可以把它包装在 1 个函数中,就像 Andrei 说的那样 【参考方案1】:

使用函数

实现一个返回输入参数的简单 JavaScript set 函数:

function set(value)
    return value;

使用此函数将 Razor 模型值分配给 JavaScript 变量:

var data = set(@Json.Encode(Model));

作为一个选项,您可以使用自调用功能:

var data = function()  return set(@Json.Encode(Model)); ();

【讨论】:

@TomStudee 我猜 JS intellisense 无法知道@Html.Raw 的结果是什么。就他而言,这还不如返回一个空字符串,给你一个var data = ; 当你将 @Html.Raw(...) 包装成类似 [...] 或 func(...) 的东西时效果很好。 Intellisense 认为您正在将某些东西传递给.. 我会推荐var model = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(model));,因为Json.Encode 有一些问题,您可能会收到Unexpected token 错误【参考方案2】:

尝试将其包装在 function 中,如下所示:

var data = function()  return @Html.Raw(Json.Encode(Model)); ();

【讨论】:

【参考方案3】:

使用JSON.Net,而不是JavaScriptSerializer 或DataContractJsonSerializer,以避免the nightmare that is JSON Dates:

var data = function ()  
    return @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)); ();

【讨论】:

对我来说效果很好,但 Json.Encode(model) 抛出错误 Unexpected Token for same data。【参考方案4】:

更简单!!这将解决这个小烦恼:

var model = [@Html.Raw(Json.Encode(Model))][0];

基本上智能感知需要@Html.Raw 周围的东西。实际上没有错,但我们必须处理智能感知的缺点。这里我们将结果声明为新数组的第一个索引,然后返回第一个索引。

仅供参考:如果您希望模型反映对 DOM 的更改,请尝试 JSModel 类。

【讨论】:

有时当你(我)不能 100% 确定瘦(剃刀视图)如何工作时,智能感知会让你(我)跌倒。谢谢,这应该是正确的答案。在我的情况下,我有一个 List 并使用 - var myJsArray = @Html.Raw(Json.Encode(@Model.SelectableUserRoleTypes)) 将其设置为视图中的 javascript 对象。后来在 knockoutjs 中我设置了一个 ko .observableArray(myJsArray)... 并且在收听智能感知警告并向赋值“@Html...”添加引号时,这将产生一个字符串而不是数组,因此 ko.observable 将给出错误“...必须是一个数组。”【参考方案5】:

您不需要编写任何新的javascript函数,只需将代码包装在括号中

var data = (@Html.Raw(Json.Encode(Model)));

在 Visual Studio 2015 中为我工作,不确定 VS2012

【讨论】:

实际上,你甚至不需要环绕括号。我得到了与 @Html.Raw(Json.Encode(Model)) 类似的东西 @Kindinos IntelliSense 存在问题,即使代码正常工作,它也会显示消息“语法错误”,因此我们只需要使用括号来抑制此警告。 这是一个很好的答案,因为它告诉你不要担心智能感知,不幸的是我的智能感知在用括号 (...) 包围代码时会抱怨,我不得不使用乍得的技巧跨度>

以上是关于使用 Html.Raw 将 ASP.NET 模型序列化为 JSON 的 Razor 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core使用Ajax局部更新

您可以将模型属性从 asp.net 模型传递到 reactjs.net 组件吗?

你能将模型属性从asp.net模型传递到reactjs.net组件吗?

ASP.NET Core MVC - 使用 Ajax 将数据发送到另一个模型中的模型

如何将两个模型组合成一个模型并使用 asp.net MVC razor 将其传递给查看

使用 jQuery 和 ASP.NET MVC 将集合插入模型,创建插件