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,页面以基本形式呈现。
所以问题变成了双重问题;
为什么我在 Identity 部分 ViewStart 文件中设置的布局(我也在 Views/Shared 文件夹中设置的布局)在所有 Identity 页面上都失败,但工作正常在区域文件夹下的任何其他页面都可以吗?
即使我直接在文件中设置布局完整路径,它仍然会失败并出现同样的错误。布局文件名为 _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。
我刚刚开始研究使用 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,页面以基本形式呈现。
所以问题变成了双重问题;
为什么我在 Identity 部分 ViewStart 文件中设置的布局(我也在 Views/Shared 文件夹中设置的布局)在所有 Identity 页面上都失败,但工作正常在区域文件夹下的任何其他页面都可以吗?
即使我直接在文件中设置布局完整路径,它仍然会失败并出现同样的错误。布局文件名为 _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。