Asp.Net Core 2.2身份页面无法与“视图/共享”文件夹中的“布局”一起使用

时间:2019-01-15 18:30:26

标签: c# asp.net-core asp.net-core-2.1 asp.net-core-identity

我刚刚开始使用Asp.Net Core 2.2进行新Web应用程序的注册/登录/注销功能。

我脚手架出了身份页面,对我来说更容易。我不喜欢这种新方法。

我的页面代码像这样生成注册页面的链接

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

这会生成链接

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

点击该链接会产生错误

  

NullReferenceException:对象引用未设置为对象的实例。

该链接看起来正确,因此我怀疑它尝试使用的布局有问题,因为这也是错误详细信息的一部分。

  

NullReferenceException:对象引用未设置为对象的实例。   _Layout-Industry.cshtml中的AspNetCore.Views_Shared__Layout_Industry.b__14_0()   +           var controllerName = this.ViewContext.RouteData.Values [“ controller”]。ToString();

因此我直接在“注册”页面和以其基本形式呈现的页面中将布局设置为null。

所以问题变成了两个问题;

  1. 为什么我在“身份”部分的ViewStart文件中设置的布局(我也已在“视图/共享”文件夹中设置的布局)在所有“身份”页面上都失败了,但是在其他任何页面上都可以正常工作在Areas文件夹下?

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

    这是首次打开的网站

Site Main Page

如果单击右上角的“注册/链接”按钮,应带您进入“注册”页面,但失败

注册页面是默认Web应用程序中的默认注册页面,“布局”页面是我自己的页面,它可用于其他14个不在“标识”区域下且在标准“视图”子文件夹中的页面上< / p>

Page load enter image description here

更新:

我有一个视图组件,可将meta标签部分加载到页面上。这是代码

@{
    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 })
}

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

1 个答案:

答案 0 :(得分:3)

它正在使用您的布局。问题是布局实际上会引发异常。现在,在Razor Pages与传统MVC视图一起使用时引发异常的原因是,对于Razor Pages,没有控制器,因此ViewContext.RouteData.Values["controller"]为null。尝试取消ToString()会导致您的NullReferenceException

对于Razor Pages,RouteData中不会包含“ action”或“ controller”,因为这两个概念均不适用。相反,您将拥有“页面”和“处理程序”。如果要在Razor Pages和MVC视图中使用相同的布局,则需要根据控制器名称来调整逻辑以适应Razor Pages。