小编典典

可以从Javascript文件访问MVC ViewBag对象吗?

c#

是否可以从MVC应用程序中的javascript文件执行以下操作?

$(function(){
   alert(@ViewBag.someValue);
}

当前它引发错误:

引用未定义的XML名称@ViewBag


阅读 491

收藏
2020-05-19

共1个答案

小编典典

我不认为目前有任何方法可以做到这一点。Razor引擎不解析Javascript文件,仅解析Razor视图。但是,您可以通过在Razor视图中设置变量来完成所需的操作:

<script>
  var someStringValue = '@(ViewBag.someStringValue)';
  var someNumericValue = @(ViewBag.someNumericValue);
</script>
<!-- "someStringValue" and "someNumericValue" will be available in script -->
<script src="js/myscript.js"></script>

正如Joe在评论中指出的那样,如果其中只有一个引号,则上面的字符串值将中断。如果要完全固定,则必须将所有单引号替换为转义的单引号。问题在于所有突然的斜线都成为问题。例如,如果您的字符串是“
foo \' bar”,而您替换了单引号,那么结果将是“ foo \\' bar”,您就回到了同样的问题。(这是链接编码的古老难题。)处理此问题的最佳方法是将反斜杠和引号视为特殊字符,并确保它们 均已 转义:

  @{
      var safeStringValue = ViewBag.someStringValue
          .Replace("\\", "\\\\")
          .Replace("'", "\\'");
  }
  var someStringValue = '@(safeStringValue)';
2020-05-19