根据 Razor Pages 中的路由有条件地呈现 html
Render html conditionally based on route in Razor Pages
假设我有以下 Razor 文件 _Layout.cshtml
。使用 ASP.NET Core 3+ 和 Razor Pages 时如何编写注释条件。
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" asp-page="/Index">Index</a>
</li>
@* If route starts with /a/, for example http://localhost/a/1.html and http://localhost/a/2/1.html *@
<li class="nav-item">
<a class="nav-link" asp-page="/a/Index">A</a>
</li>
@* If route starts with /b/, for example http://localhost/b/1.html and http://localhost/b/2/1.html *@
<li class="nav-item">
<a class="nav-link" asp-page="/b/Index">B</a>
</li>
<li class="nav-item">
<a class="nav-link" asp-page="/b/1/Index">B other</a>
</li>
</ul>
在 Razor Pages 中,您可以使用 ViewContext.RouteData.Values["page"]
,也在 _Layout 文件中。如果 URL 是例如https://localhost:44359/Help/About
那么它会产生 /Help/About
.
使用您的代码:
@{
string page = ViewContext.RouteData.Values["page"] as string; // Values[] produces objects, so cast is needed
}
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" asp-page="/Index">Index</a>
</li>
@if (page.StartsWith("/a/"))
{
<li class="nav-item">
<a class="nav-link" asp-page="/a/Index">A</a>
</li>
}
@if (page.StartsWith("/b/"))
{
<li class="nav-item">
<a class="nav-link" asp-page="/b/Index">B</a>
</li>
<li class="nav-item">
<a class="nav-link" asp-page="/b/1/Index">B other</a>
</li>
}
</ul>
您可以为特定文件夹中的所有 Razor Pages 执行 Razor Pages 约定。使用此约定,您可以设置操作过滤器(结果过滤器)以将标识符添加到 ViewData。
过滤器:
class AddRouteIdentifierFilter : ResultFilterAttribute
{
private readonly string identifier;
public TestFilter(string identifier)
{
this.identifier = identifier;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
base.OnResultExecuting(context);
((PageResult)context.Result).ViewData["route-identifier"] = identifier;
}
}
设置约定:
services.AddMvc().AddRazorPagesOptions(opt =>
opt.Conventions.AddFolderApplicationModelConvention("/A", model =>
model.Filters.Add(new AddRouteIdentifierFilter("a"));
);
opt.Conventions.AddFolderApplicationModelConvention("/B", model =>
model.Filters.Add(new AddRouteIdentifierFilter("b"));
);
);
访问 Razor 页面视图中的标识符:
<h1>Identifier: @ViewData["route-identifier"]</h1>
假设我有以下 Razor 文件 _Layout.cshtml
。使用 ASP.NET Core 3+ 和 Razor Pages 时如何编写注释条件。
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" asp-page="/Index">Index</a>
</li>
@* If route starts with /a/, for example http://localhost/a/1.html and http://localhost/a/2/1.html *@
<li class="nav-item">
<a class="nav-link" asp-page="/a/Index">A</a>
</li>
@* If route starts with /b/, for example http://localhost/b/1.html and http://localhost/b/2/1.html *@
<li class="nav-item">
<a class="nav-link" asp-page="/b/Index">B</a>
</li>
<li class="nav-item">
<a class="nav-link" asp-page="/b/1/Index">B other</a>
</li>
</ul>
在 Razor Pages 中,您可以使用 ViewContext.RouteData.Values["page"]
,也在 _Layout 文件中。如果 URL 是例如https://localhost:44359/Help/About
那么它会产生 /Help/About
.
使用您的代码:
@{
string page = ViewContext.RouteData.Values["page"] as string; // Values[] produces objects, so cast is needed
}
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" asp-page="/Index">Index</a>
</li>
@if (page.StartsWith("/a/"))
{
<li class="nav-item">
<a class="nav-link" asp-page="/a/Index">A</a>
</li>
}
@if (page.StartsWith("/b/"))
{
<li class="nav-item">
<a class="nav-link" asp-page="/b/Index">B</a>
</li>
<li class="nav-item">
<a class="nav-link" asp-page="/b/1/Index">B other</a>
</li>
}
</ul>
您可以为特定文件夹中的所有 Razor Pages 执行 Razor Pages 约定。使用此约定,您可以设置操作过滤器(结果过滤器)以将标识符添加到 ViewData。
过滤器:
class AddRouteIdentifierFilter : ResultFilterAttribute
{
private readonly string identifier;
public TestFilter(string identifier)
{
this.identifier = identifier;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
base.OnResultExecuting(context);
((PageResult)context.Result).ViewData["route-identifier"] = identifier;
}
}
设置约定:
services.AddMvc().AddRazorPagesOptions(opt =>
opt.Conventions.AddFolderApplicationModelConvention("/A", model =>
model.Filters.Add(new AddRouteIdentifierFilter("a"));
);
opt.Conventions.AddFolderApplicationModelConvention("/B", model =>
model.Filters.Add(new AddRouteIdentifierFilter("b"));
);
);
访问 Razor 页面视图中的标识符:
<h1>Identifier: @ViewData["route-identifier"]</h1>