剃刀页面:如何在部分页面中包括pagesection?

时间:2020-10-29 23:29:10

标签: c# .net asp.net-core razor-pages

我有一个Razor Pages布局页面,其中包括导航栏作为部分页面

<html>
...
<body>
...
<partial name="_Nav" />

在我的_Nav.cshtml内

<div class="links">
    <a href="#link1">link 1</a>
    <a href="#link2">link 2</a>
<!-- custom links that are set by each page  go here-->
</div>

网站的每个页面都使用此布局。我希望能够包含与网站中每个页面相关的“额外”链接。

我尝试过这样做是@RenderSection,但似乎仅在Layout页中允许使用部分。这是否意味着我需要删除我的_Nav局部文件并将所有代码集中到一个文件中?还是有一种方法可以保持组织化的代码结构并仍然传递一些代码?有了jinja2代码块,这没问题,所以我希望Razor Pages中也有一种不错的方法!

此外,我真的不想将完整的html字符串从c#类传递到html,我已经在链接中传递了我需要的所有变量。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您不必将HTML存储在ViewDataDictionary中。

在每个要添加额外链接的视图上,存储一个List<string>,字符串为url,如下所示:

查看:

@{
   ViewData["Links"] = new List<string>(){ "https://www.google.com", "https://www.facebook.com" };
}

然后在“布局”视图中:

<partial name="_Nav" view-data="@ViewData" />

现在在您的局部视图中:

//Default Links
@if (ViewData["Links"] != null)
{
  //We have extra links
  List<string> links = (List<string>)ViewData["Links"];
  foreach (string link in links)
  {
    <a href="@link">link1</a>
  }
}

答案 1 :(得分:0)

RenderSection只能从布局页面调用。

没有此类插件可将动态链接添加到部分视图。

作为一种解决方法,您可以将div放在_Nav.cshtml之外,如下所示,并使用RenderSection动态添加指向div的链接:

....             
    <div class="links">
        <partial name="_Nav" />
        @RenderSection("Html", required: false)
    </div>
....

_Nav.cshtml:

<a href="#link1">link 1</a>
<a href="#link2">link 2</a>

测试视图:

@page
@model IndexModel

//do your stuff...

@section Html
{
    <a href='#link3'>link3</a>
}
相关问题