我写了一个名为社交网络项目。它的核心ASP.NET Web应用程序模板+ Web应用程序(模型 - 视图 - 控制器)。
我加的功能,其中,如果用户被授权,那么他将有一个“退出”字段,如果没有登录 - 页面"_Layout.cshtml"
“登录”。对于这一点,我用ViewComponent。
但是路由无法正常工作。当我点击“登录”,我将被重定向到".../Account/~/Account/Login"
,而不是".../~/Account/Login"
,如下面的截图。
文件"_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>"));
}
}
}
}
问题是,在你的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))
);
}
}
}
问题是你href
属性值。从~
标签的所有href
取出<a>
写如下:
return new HtmlContentViewComponentResult(
new HtmlString(@"<li><a href=""/Account/Login"" class=""navbar-brand"">Login</a></li>"));