使用 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您不需要编写任何新的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 模型传递到 reactjs.net 组件吗?
你能将模型属性从asp.net模型传递到reactjs.net组件吗?
ASP.NET Core MVC - 使用 Ajax 将数据发送到另一个模型中的模型