我根据文档搭建了Identity脚手架,除了/Manage
文件夹的布局外,其他一切都正常工作。目录的设置与搭建的完全一样
所有杂项的目录设置。文件已删除
为了清楚起见:/Areas/Identity/Pages/Account/Manage
是问题文件夹
/Pages
包含ViewStart文件,该文件从我的Views/Shared文件夹中设置布局/Pages/Account
从_Viewstart接收布局并正常工作/Pages/Account/Manage
此处的所有内容仅接收_ViewStart布局。此处的Layout文件不是由其中的页面自动找到的。
Areas/Identity/Pages/Account/Manage/_Layout.cshtml
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h1>Manage your account</h1>
<div>
<h4>Change your account settings</h4>
<hr />
<div class="row">
<div class="col-md-3">
<partial name="_ManageNav" />
</div>
<div class="col-md-9">
@RenderBody()
</div>
</div>
</div>
@section Scripts {
@RenderSection("Scripts", required: false)
}
这正是它被搭建起来的样子,只有当您将AddDefaultIdentity((更改为AddIdentity((时,布局才会中断。我使用了一个我搭建的参考,这让我相信我在删除默认UI时没有考虑到什么。我找到的唯一解决方法是手动设置/Manage
中每个.cshtml文件的布局
@{
Layout = "_Layout";
}
这修复了所有问题,并使/Manage
内部页面的布局正常工作。我阅读了文档,其中指出,每个Razor Page控制器在搜索其他位置之前,都应该在自己的文件夹中搜索_Layout文件。它没有检测到文件是有原因的吗?
-
"我找到的唯一解决方法是手动设置/Manage中每个.cshtml文件的布局":
你不必这么做。只需在
Manage/
下创建一个_ViewStart.cshtml
foler:@* file: Manage/_ViewStart.cshtml *@ @{ Layout = "_Layout"; // Use a partial layout name instead of absolute name }
还要注意,默认的
Manage/Layout.cshtml
使用/Areas/Identity/Pages/_Layout.cshtml
的父布局,该父布局可能不存在于您的脚手架文件中:@* file: Manage/Layout.cshtml *@ @{ Layout = "/Areas/Identity/Pages/_Layout.cshtml"; // you might want to change this to `/Views/Shared/_Layout.cshtml` }
-
"它规定每个Razor Page控制器在搜索其他地方之前,都应该在自己的文件夹中搜索布局文件(_Layout(">
只有当您使用部分
_Layout
名称时,这才是真的但是,如果使用以斜杠开头的绝对名称,则将直接使用该布局。参见官方文件:当提供部分名称 时,Razor视图引擎会使用其标准发现过程搜索布局文件。首先搜索处理程序方法(或控制器(所在的文件夹,然后搜索共享文件夹。此发现过程与用于发现局部视图的过程相同
在您的情况下,以
/
开头的布局名称/Areas/Identity/Pages/_Layout.cshtml
不是部分名称。这就是您的页面无法发现布局的原因。为了解决此问题,请改用部分名称_Layout
。(这可以通过一个_ViewStart.cshtml
文件来完成,就像我上面所做的那样,不要为每一页添加它( -
最后,您可能想知道为什么在使用
AddDefaultIdentity()
时它会正常渲染。正如您所发现的,AddDefaultIdentity()
将添加默认的UI,它最终调用AddRelatedParts()
方法。这样,当没有这样的布局或页面时,它就可以回退到默认的UI。例如,当您用Visual Studio
构建Identity
时,它提供了一个列表,您可以使用该列表来覆盖默认页面。上述/Areas/Identity/Pages/_Layout.cshtml
来自默认的UI。