ASP .NET Core зависает при загрузке компонента в режиме частичного просмотра - PullRequest
0 голосов
/ 11 января 2019

Я работаю над приложением 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 голосов
/ 12 января 2019

Похоже, проблема в том, что _LoginPartial содержится в _Layout и отображает ваш View View, который затем ссылается на _Layout. Это создаст циклическую ссылку, и код для вашего компонента представления (и код для _Layout) будет вызываться снова и снова.

_Layout -> _LoginPartial -> Default.cshtml (из компонента просмотра) -> _Layout -> _LoginPartial -> Default.cshtml (из компонента просмотра) ) и так далее и дальше .....

установка для макета значения null в представлении ViewComponent должна решить вашу проблему.

@{
    ViewData["Title"] = "Default";
    Layout = null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...