我刚刚开始使用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。
所以问题变成了两个问题;
为什么我在“身份”部分的ViewStart文件中设置的布局(我也已在“视图/共享”文件夹中设置的布局)在所有“身份”页面上都失败了,但是在其他任何页面上都可以正常工作在Areas文件夹下?
即使我直接在文件中设置布局完整路径,它仍然会失败,并出现相同的错误。布局文件名为_Layout-Industry,但我在错误详细信息中注意到它显示为_Layout_Industry,是连字符引起了问题吗?
这是首次打开的网站
如果单击右上角的“注册/链接”按钮,应带您进入“注册”页面,但失败
注册页面是默认Web应用程序中的默认注册页面,“布局”页面是我自己的页面,它可用于其他14个不在“标识”区域下且在标准“视图”子文件夹中的页面上< / p>
更新:
我有一个视图组件,可将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 })
}
由于“身份”页面中没有控制器,因此控制器和操作调用失败。我将它们设置为可为空并绕过它们,现在加载了注册页面。有没有一种方法可以从身份页面获取视图名称,然后可以像对其他所有页面一样检索元标记。
答案 0 :(得分:3)
它正在使用您的布局。问题是布局实际上会引发异常。现在,在Razor Pages与传统MVC视图一起使用时引发异常的原因是,对于Razor Pages,没有控制器,因此ViewContext.RouteData.Values["controller"]
为null。尝试取消ToString()
会导致您的NullReferenceException
。
对于Razor Pages,RouteData中不会包含“ action”或“ controller”,因为这两个概念均不适用。相反,您将拥有“页面”和“处理程序”。如果要在Razor Pages和MVC视图中使用相同的布局,则需要根据控制器名称来调整逻辑以适应Razor Pages。