与使用ViewComponent类路由问题

问题描述 投票:1回答:2

我写了一个名为社交网络项目。它的核心ASP.NET Web应用程序模板+ Web应用程序(模型 - 视图 - 控制器)。

我加的功能,其中,如果用户被授权,那么他将有一个“退出”字段,如果没有登录 - 页面"_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>"));
            }
        }
    }
}
c# asp.net-core routing
2个回答
1
投票

问题是,在你的CSHTML,视图被渲染时的波浪~转化。然而,在ViewComponent,不是因为你是负责生成视图相关信息的情况。

使用ViewComponent.Url Property来生成所需的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))
            );
        }
    }
}

1
投票

问题是你href属性值。从~标签的所有href取出<a>写如下:

return new HtmlContentViewComponentResult(
                new HtmlString(@"<li><a href=""/Account/Login"" class=""navbar-brand"">Login</a></li>"));
© www.soinside.com 2019 - 2024. All rights reserved.