ASP.NET Core Razor 页面中的变量范围和 HTML 标记

Posted

技术标签:

【中文标题】ASP.NET Core Razor 页面中的变量范围和 HTML 标记【英文标题】:Variable scope and HTML tag in ASP.NET Core Razor Pages 【发布时间】:2021-08-05 09:48:13 【问题描述】:

我使用 Visual Studio 2019 和“Web 应用程序”模板创建了一个新的 ASP.NET Core 3.1 Web 应用程序项目。一切正常,我可以毫无问题地构建和运行应用程序。

然后我开始编辑_Layout.cshtml 文件。这个 sn-p 构建良好:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>@ViewData["Title"] - WebApplication1</title>
</head>
<body>
    @ string foo = (string)ViewData["foo"]; 
    @if (foo == "bar")
    
        <div>test</div>
    
    @RenderBody()
</body>
</html>

这个没有构建:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>@ViewData["Title"] - WebApplication1</title>
    @ string foo = (string)ViewData["foo"]; 
</head>
<body>
    @if (foo == "bar")
    
        <div>test</div>
    
    @RenderBody()
</body>
</html>

使用第二个 sn-p 构建解决方案会导致以下错误:

1>------ Build started: Project: WebApplication1, Configuration: Debug Any CPU ------
1>C:\...\WebApplication1\WebApplication1\Pages\Shared\_Layout.cshtml(9,10,9,13): error CS0103: The name 'foo' does not exist in the current context
1>Done building project "WebApplication1.csproj" -- FAILED.

Razor Pages 变量的范围是否仅限于其声明的 HTML 标记?如果是这样,为什么当我在无法访问的范围内声明变量并允许我使用 F12 键导航到变量定义时智能感知没有显示任何错误?

【问题讨论】:

【参考方案1】:

我使用了你的_Layout.cshtml视图代码,在VS启动的时候出现了和你一样的错误,然后页面报如下错误:

默认情况下,每个布局都必须调用 RenderBody。无论在哪里调用RenderBody,都会渲染视图的内容。添加之后,就可以正常启动项目了。

除了Razor变量的问题,只需要在block中使用@声明变量即可。然后,您可以在视图中的任何位置使用该变量。

【讨论】:

正如问题中提到的,为简洁起见,我没有在 sn-p 中包含所有原始内容。 RenderBody 调用在我的布局中执行。事实上,我并没有从 Visual Studio 生成的原始布局中删除任何一行代码,我只是添加了 sn -p 中显示的行。另请注意,变量声明中使用了@

以上是关于ASP.NET Core Razor 页面中的变量范围和 HTML 标记的主要内容,如果未能解决你的问题,请参考以下文章

ASP .NET Core Razor 页面中的授权

Asp.Net Core Razor 页面中的远程验证

Asp.net Core Razor 页面中的引导警报

更改 ASP.NET Core Razor 页面中的默认登录页面?

将 ASP.NET Core Razor 页面中的默认页面更改为登录页面

如何使用 ASP.NET Core Razor 页面预选下拉列表中的项目