【问题标题】:Visual Studio "Conditiional compilation is turned off" Error In View When Passing JSON Object传递 JSON 对象时,Visual Studio“条件编译已关闭”错误
【发布时间】:2011-08-23 16:17:38
【问题描述】:

我通过 ViewBag 将 JSON 对象传递给 Javascript,在我的视图中使用以下代码:

var jsonResultData = @Html.Raw(ViewBag.JsonResultData);

这种方法效果很好,但 VisualStudio 不断给我“条件编译已关闭”警告。似乎 VS 想要引用 @Html.Raw(ViewBag.JsonResultData);如果我添加引号,jQuery 会将变量视为字符串而不是 JSON 数据。

我的方法有缺陷吗?我应该用另一种方法来解决这个问题吗?如果没有,我可以禁用 VS 警告吗?警告的一个恼人的副作用是我无法使用 CTRL K-D 格式化我的代码。

【问题讨论】:

  • 那是 Javascript,不是 jQuery。

标签: javascript visual-studio razor


【解决方案1】:

您为什么使用 ViewBag?我想在您的控制器操作中,您已经手动将某些模型序列化为 JSON,不是吗?像这样的:

public ActionResult Foo()
{
    var model = ...
    ViewBag.JsonResultData = new JavaScriptSerializer().Serialize(model);
    return View(model);
}

我不建议你这样做。而是这样做:

public ActionResult Foo()
{
    var model = ...
    return View(model);
}

在你看来:

<script type="text/javascript">
    var jsonResultData = @Html.Raw(Json.Encode(Model));
</script>

就警告而言,Razor Intellisense 远非完美。您可能确实会收到一些警告,尤其是当您将 razor 与 javascript 混合使用时。我们只能希望他们能在 ASP.NET MVC 的未来版本中解决这个问题。暂时忽略这些警告。老实说,当我使用视图时,我不再查看 Visual Studio 中的警告或错误,因为我事先知道它们是错误的,并且我的应用程序在运行时运行良好。

【讨论】:

  • 达林,没错。我正在序列化控制器中的数据。我正在使用 ViewBag,因为我只是在传递错误字符串。我没有序列化整个模型。为什么建议在客户端使用 Json.Encode 对数据进行编码而不是在服务器端进行编码?
  • @Mark S.,因为我认为 ViewBag/ViewData 的使用在 ASP.NET MVC 中是不好的做法。它是弱类型的,你没有 Intellisense,你依赖于魔法字符串,你的单元测试对修改非常脆弱,你的代码对重构不友好,......而且因为你已经有一个控制器动作返回一个强类型视图模型到视图为什么要在这个控制器动作中编写额外的无意义代码?当您只需要在模型内部时,为什么要让这个动作变得胖呢?然后在视图中,如果您需要使用 javascript 访问它,只需 JSON 序列化此模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多