首先,这段代码确实有效,但它给了我一个低水平的烦恼,我想摆脱它。我有一个使用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中。有什么想法吗?
我完全接受这个问题是迂腐和琐碎的,因为代码工作得非常好并且看起来很干净,但它让我很烦恼。
答案 0 :(得分: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"};
答案 1 :(得分:0)
'您可以在您的ActionMethod中将您的模型序列化为Json,并通过ViewData或ViewBag将其传递给您的视图,并使用Html.Raw将其传递给ViewModel,类似这样:
//在你的ActionMethod中
var serializer = new JavaScriptSerializer();
Viewdata [“SomeName”] = serializer.Serialize(model);
//在你的cshtml中
@ {
string data =(string)Viewdata [“SomeName”];
}
$(document).ready(function(){
var contentListingModel = new ContentListingModel('@Html.Raw(data)');
ko.applyBindings(contentListingModel, $('#pageRoot').get(0));
});
答案 2 :(得分:0)
javascript调试器忽略剃刀代码并看到这个
var data = ;
这是语法错误,请替换此
var data = @Html.Raw(Json.Encode(Model));
这样,警告就会消失。
var data @('=') @Html.Raw(Json.Encode(Model));