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

Tom*_*dee 24 .net html c# asp.net-mvc razor

这行在Visual Studio 2012中给我一个语法错误(字面上只是'语法错误'):

var data = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
Run Code Online (Sandbox Code Playgroud)

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

我的模型被正确地序列化到数据var中,并且应用程序正常工作.在美容方面,将错误永久存在于我的错误列表中会很烦人.

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

编辑:

根据要求,更多背景.这是整个$(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>
Run Code Online (Sandbox Code Playgroud)

And*_*rei 27

使用功能

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

function set(value){
    return value;
}
Run Code Online (Sandbox Code Playgroud)

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

var data = set(@Json.Encode(Model));
Run Code Online (Sandbox Code Playgroud)

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

var data = function() { return set(@Json.Encode(Model)); }();
Run Code Online (Sandbox Code Playgroud)

  • 当你将@ Html.Raw(...)包装成类似[...]或func(...)之类的东西时效果很好.Intellisense认为你正在传递一些东西.. (3认同)
  • @TomStudee我想JS intellisense无法知道@ Html.Raw的结果是什么.就他而言,这可能会返回一个空字符串,给你一个`var data =;`. (2认同)

hai*_*770 16

尝试将其包装在function以下内容中:

var data = function() { return @Html.Raw(Json.Encode(Model)); }();
Run Code Online (Sandbox Code Playgroud)


Ric*_*ema 13

使用JSON.Net而不是JavaScriptSerializer或DataContractJsonSerializer来避免JSON日期的噩梦:

var data = function () { 
    return @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)); }();
Run Code Online (Sandbox Code Playgroud)


Cha*_*ehn 8

更容易!! 这将解决这个小烦恼:

var model = [@Html.Raw(Json.Encode(Model))][0];
Run Code Online (Sandbox Code Playgroud)

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

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