如何在脚本块中正确使用剃刀语法?

Mic*_*ael 2 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>
Run Code Online (Sandbox Code Playgroud)

但是当我运行页面时,我进入了这一行:

url = '@Url.Content("~/Account/GetLayers/")';
Run Code Online (Sandbox Code Playgroud)

这个错误:

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

所以我试过这个:

 url = "@Url.Content("~/Account/GetLayers/")";
Run Code Online (Sandbox Code Playgroud)

但现在我收到这个错误:

CS1002:;预期的

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

Shy*_*yju 6

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

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

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

The@:告诉 razor 下面的表达式应该被认为不是代码,而是纯文本

与使用<text>标签相同

@if (!Request.IsAuthenticated)
{
   <text>url = '@Url.Action("Index")'</text>;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用三元运算符将其转换为单行

<script type="text/javascript">
    var url = '@(Request.IsAuthenticated ? Url.Action("GetLayers","Account") 
                                                   :  Url.Action("Login","Account"))';
    console.log(url);
</script>
Run Code Online (Sandbox Code Playgroud)