Asp.Net 核心 2.2 标识页面无法与 View/Shared 文件夹中的布局一起使用

Asp.Net Core 2.2 Identity pages wont work with Layout in View/Shared folder

我刚刚开始研究使用 Asp.Net Core 2.2 的新网络应用程序的 registration/login/logout 功能。

我已经搭建了身份页面,对我来说更容易。我不喜欢这种新方法。

我的页面代码像这样为注册页面生成 link

<div class="text-right reg-button">
    <a asp-area="Identity" asp-page="/Account/Register" class="submit">Register</a>
</div>

这会生成 link

<div class="text-right reg-button">
    <a class="submit" href="/Identity/Account/Register">Register</a>
</div>

单击 link 会产生错误

NullReferenceException: Object reference not set to an instance of an object.

link 看起来不错,所以我怀疑它尝试使用的布局有问题,因为这也是错误详细信息的一部分。

NullReferenceException: Object reference not set to an instance of an object. AspNetCore.Views_Shared__Layout_Industry.b__14_0() in _Layout-Industry.cshtml + var controllerName = this.ViewContext.RouteData.Values["controller"].ToString();

所以我直接在Register页面设置layout为null,页面以基本形式呈现。

所以问题变成了双重问题;

  1. 为什么我在 Identity 部分 ViewStart 文件中设置的布局(我也在 Views/Shared 文件夹中设置的布局)在所有 Identity 页面上都失败,但工作正常在区域文件夹下的任何其他页面都可以吗?

  2. 即使我直接在文件中设置布局完整路径,它仍然会失败并出现同样的错误。布局文件名为 _Layout-Industry,但我在错误详细信息中注意到它显示为 _Layout_Industry,连字符是否导致问题?

    这是第一次打开时的网站

如果您点击右上角的 Register/Link 按钮,它应该会带您进入注册页面,但失败了

注册页面是默认 Web 应用程序中的默认注册页面,布局页面是我自己的,它适用于所有 14 个不在身份区域下的其他页面,并且在标准视图中子文件夹

更新:

我有一个将元标记部分加载到页面的视图组件。这是代码

@{
    var controllerName = this.ViewContext.RouteData.Values["controller"]?.ToString();
    var actionName = this.ViewContext.RouteData.Values["action"]?.ToString();
    var userid = UserManager.GetUserId(User);
}
<!--Meta Tags- Using MetatagViewComponent-->
@if (controllerName != null && actionName != null)
{
    @await Component.InvokeAsync("Metatag", new MetatagViewComponent.MetatagRequest { Controller = controllerName, Action = actionName })
}

控制器和操作调用失败,因为身份页面中没有控制器。我让它们可以为空并绕过它们,现在加载了注册页面。有没有办法从身份页面获取视图名称,然后我可以像对所有其他页面一样检索元标记。

它正在使用您的布局。问题是您的布局确实会引发异常。现在,与传统 MVC 视图相比,它在被 Razor 页面使用时抛出异常的原因是,对于 Razor 页面,没有控制器,因此 ViewContext.RouteData.Values["controller"] 为空。尝试调用 ToString() 会导致你的 NullReferenceException

对于 Razor Pages,"action" 和 "controller" 都不会出现在您的 RouteData 中,因为这些概念都不适用。相反,您将拥有 "page" 和 "handler"。如果您想对 Razor Pages 和 MVC 视图使用相同的布局,那么您需要围绕控制器名称调整逻辑以适应 Razor Pages。