ASP .NET Core在部分视图中卡住了加载视图组件

时间:2019-01-11 20:42:19

标签: c# asp.net-core asp.net-core-mvc

我正在开发ASP .NET Core应用程序,并且试图在_LoginPartial内部加载视图组件。 _LoginPartial是在创建新项目时自动创建的,并且我的视图组件称为UserNameViewComponent。视图组件应获取登录用户的用户名,并将其显示在屏幕顶部。

每当我登录时,页面应用程序都会卡在登录屏幕上,直到我停止它为止。我在_LoginPartial的行中添加了一个断点,该断点调用了视图组件。当调用视图组件时,它成功获取了我的用户名,但是当它返回_LoginPartial时,它将再次运行同一行代码以返回到视图组件,这种情况永远存在。

_LoginPartial中的代码块,其中调用了视图组件:

 @if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
    <a class="nav-link text-light" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">@await Component.InvokeAsync("UserName")</a>
</li>
    <li class="nav-item">
        <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
            <button type="submit" class="nav-link btn btn-link text-light">Logout</button>
        </form>
    </li>
}

UserNameViewComponent:

namespace Tangy.ViewComponents
{
public class UserNameViewComponent : ViewComponent
{
    private readonly ApplicationDbContext _db;
    public UserNameViewComponent(ApplicationDbContext db)
    {
        _db = db;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var claimsIdentity = (ClaimsIdentity)this.User.Identity;
        var claim = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier);

        var userFromDb = await _db.Users.Where(u => u.Id == claim.Value).FirstOrDefaultAsync();

        return View(userFromDb);
    }

}

Default.cshtml:

@model Tangy.Models.ApplicationUser
@{
    ViewData["Title"] = "Default";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Hi @Model.FirstName @Model.LastName <i class="far fa-user"></i>

有人知道我在做什么错吗?

1 个答案:

答案 0 :(得分:2)

问题似乎是_LoginPartial包含在_Layout中,并呈现了随后引用_Layout的View组件。这将创建一个循环引用,并且将一遍又一遍地调用视图组件的代码(以及_Layout的代码)。

_Layout-> _LoginPartial-> Default.cshtml(来自视图组件)-> _Layout-> _LoginPartial-> Default.cshtml(来自查看组件 )等等。

在ViewComponent的视图中将Layout设置为null应该可以解决您的问题。

@{
    ViewData["Title"] = "Default";
    Layout = null;
}