4

首先,这段代码确实有效,但它给了我一些我想摆脱的烦恼。我有一个使用 razor 语法构建的 .cshtml 页面。幕后有一个巨大的、令人讨厌的、淘汰的对象,页面上的许多东西都绑定到它上面。目前,在实例化该淘汰模型时,我通过在如下所示的字符串文字中序列化有问题的 C# viewmodel 对象来做到这一点。

<script type="text/javascript">
        $(document).ready(function() {
            var data = @Html.Raw(Json.Encode(Model));
            var contentListingModel = new ContentListingModel(data);
            ko.applyBindings(contentListingModel, $('#pageRoot').get(0));
        });
</script>

就像我说的,代码有效。但是,在调用 @Html.Raw 时,我收到了警告。Visual Studio 认为那里存在语法错误(在呈现后没有)。现在,这完全有道理,为什么事情认为那里存在语法问题。但是我很想通过以不会触发此问题的方式进行编码来消除警告(我意识到我可以隐藏警告或做任何其他事情),但我只是希望它在以下情况下不显示我将 C# 对象序列化为 JSON 并将它们填充到页面上的 javascript 中。有任何想法吗?

我完全接受询问这个问题是迂腐和琐碎的,因为代码运行良好并且看起来很干净,但这让我很恼火。

4

3 回答 3

1

IDE 足够聪明,可以接受纯粹由 Razor 组成的行,因此您可以编写:

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

如果(假定的)隐式全局困扰您(例如,它触发 Resharper 警告),请拆分声明和分配。

var data; // javascript
@Html.Raw( "data= " + Json.Encode(Model) + ";" ) // all razor

在运行时产生:

var data;
data = {"foo": "bar"};
于 2013-10-03T03:15:26.703 回答
0

'您可以在 ActionMethod 中将模型序列化为 Json,然后通过 ViewData 或 ViewBag 将其传递给您的视图,然后使用 Html.Raw 将其传递给 ViewModel,如下所示:

//在你的ActionMethod中

var serializer = new JavaScriptSerializer();

Viewdata["SomeName"] = serializer.Serialize(model);

//在你的cshtml中

@{

字符串数据 = (string)Viewdata["SomeName"];

}

$(文档).ready(函数() {

        var contentListingModel = new ContentListingModel('@Html.Raw(data)');
        ko.applyBindings(contentListingModel, $('#pageRoot').get(0));

    });
于 2013-09-02T19:13:05.990 回答
0

javascript调试器忽略剃刀代码并看到这个

var data = ;

这是一个语法错误,替换这个

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

有了这个,警告就会消失。

var data @('=') @Html.Raw(Json.Encode(Model));
于 2013-10-03T02:56:29.560 回答