【问题标题】:Razor syntax error serializing ASP.NET Model to JSON with Html.Raw使用 Html.Raw 将 ASP.NET 模型序列化为 JSON 的 Razor 语法错误
【发布时间】: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 说的那样

标签: c# html .net asp.net-mvc razor


【解决方案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 存在问题,即使代码正常工作,它也会显示消息“语法错误”,因此我们只需要使用括号来抑制此警告。
    • 这是一个很好的答案,因为它告诉你不要担心智能感知,不幸的是我的智能感知在用括号 (...) 包围代码时会抱怨,我不得不使用乍得的技巧跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多