Проблемы с маршрутизацией с использованием класса ViewComponent - PullRequest
0 голосов
/ 20 января 2019

Я пишу проект под названием Социальная сеть.Это ASP.NET Core Web Application + шаблон веб-приложения (Model-View-Controller).

Я добавил функциональность, в которой, если пользователь авторизован, то у него будет поле «Выход из системы», если он не зарегистрирован.в - «логин» на странице "_Layout.cshtml".Для этого я использовал ViewComponent.

Но маршрутизация не работает должным образом.Когда я нажимаю «Войти», меня перенаправляют на ".../Account/~/Account/Login" вместо ".../~/Account/Login", как показано на скриншоте ниже.

снимок экрана:
screenshot

Часть файла "_Layout.cshtml":

<ul class="nav navbar-nav">
    <li><a href="~/Home/Index" class="navbar-brand">My page</a></li>
    <li><a href="~/Home/Users" class="navbar-brand">Users</a></li>
    @await Component.InvokeAsync("MenuParts")
    <li><a href="~/Account/Register" class="navbar-brand">Register</a></li>
</ul>

Маршрутизация в файле "Startup.cs":

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{login?}");
});

MenuPartsViewComponent.cs:

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ViewComponents;

namespace SocialNetwork.Components
{
    public class MenuPartsViewComponent : ViewComponent
    {
        public IViewComponentResult Invoke()
        {
            if (HttpContext.User.Identity.Name == null)
            {
                return new HtmlContentViewComponentResult(
                    new HtmlString(@"<li><a href=""~/Account/Login"" class=""navbar-brand"">Login</a></li>"));
            }
            else
            {
                return new HtmlContentViewComponentResult(
                    new HtmlString(@"<li><a href=""~/Account/Logout"" class=""navbar-brand"">Logout</a></li>"));
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Дело в том, что в вашем cshtml тильда ~ преобразуется при визуализации представления. Однако в ViewComponent это не так, поскольку вы несете ответственность за создание информации, связанной с просмотром.

Используйте свойство ViewComponent.Url , чтобы сгенерировать нужные URL-адреса вместо их жесткого кодирования

public class MenuPartsViewComponent : ViewComponent {
    public IViewComponentResult Invoke() {
        if (HttpContext.User.Identity.Name == null) {
            var login = Url.Action("Login", "Account");
            var html = @"<li><a href=""{0}"" class=""navbar-brand"">Login</a></li>";
            return new HtmlContentViewComponentResult(
                new HtmlString(string.Format(html, login))
            );
        } else {
            var logout = Url.Action("Logout", "Account");
            var html = @"<li><a href=""{0}"" class=""navbar-brand"">Logout</a></li>";
            return new HtmlContentViewComponentResult(
                new HtmlString(string.Format(html, logout))
            );
        }
    }
}
0 голосов
/ 20 января 2019

Проблема в вашем href значении атрибута. Удалите ~ из всех тегов href из <a> и напишите следующее:

return new HtmlContentViewComponentResult(
                new HtmlString(@"<li><a href=""/Account/Login"" class=""navbar-brand"">Login</a></li>"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...