如何在脚本块中使用正确的razor语法?

时间:2017-11-13 19:55:40

标签: asp.net-mvc razor

我从事ASP.NET MVC 5项目。

我尝试在cshtml页面的脚本区域中使用razor语法:

<script type="text/javascript">
    var url = '@Url.Content("~/Account/Login/")';

    @if (Request.IsAuthenticated)
     {
          url = '@Url.Content("~/Account/GetLayers/")';
     }
</script>

但是当我运行页面时,我会看到这一行:

url = '@Url.Content("~/Account/GetLayers/")';

此错误:

  

CS1012:字符文字中的字符太多

所以我尝试了这个:

 url = "@Url.Content("~/Account/GetLayers/")";

但现在我收到了这个错误:

  

CS1002 :;预期

我知道为什么我的上述尝试不起作用?

1 个答案:

答案 0 :(得分:3)

因为您已经在C#代码块中(由if条件语句打开)。如果您想将js /纯文本与剃刀中的C#代码混合使用,请使用@:前缀

如果您尝试为操作方法生成相对网址,则应考虑使用Url.Action方法。

<script type="text/javascript">
  var url = '@Url.Action("Login","Account")';
  @if (Request.IsAuthenticated)
  {
      @:url = '@Url.Action("GetLayers","Account")';
  }
</script>

@:告诉剃刀以下表达式应该被视为非代码,而是纯文本

与使用<text>标记

相同
@if (!Request.IsAuthenticated)
{
   <text>url = '@Url.Action("Index")'</text>;
}

您可以使用三元运算符

将其转换为单行
<script type="text/javascript">
    var url = '@(Request.IsAuthenticated ? Url.Action("GetLayers","Account") 
                                                   :  Url.Action("Login","Account"))';
    console.log(url);
</script>