我正在编写一个应用程序,并且我已经使用cookie中间件实现了用户登录功能。我的共享_Layout视图有一个导航栏,其中包含“注册”,“登录”和“注销”的链接。问题是导航栏上始终显示“登录”和“注销”,无论是否登录,所以我需要能够从我的控制器访问共享视图页面中的html元素以隐藏登录时“登录”按钮,并在未登录时隐藏“注销”按钮。
答案 0 :(得分:1)
我需要能够从我的控制器
访问共享视图页面中的html元素
这不是你在MVC中做的事情。在MVC中,控制器将静态类型或动态(视图包)数据传递给视图。然后视图使用此数据构建它想要的任何HTML。
第一个选项是布局菜单(在_layout视图中)使用viewbag中的一些属性,如 IsAuthenticated , UserName 。然后,您必须在每个动作上设置这些viewbag属性,这不是很方便。
第二个选项,在应用程序启动时注册一个全局过滤器,该过滤器将应用于所有控制器操作。根据身份验证状态,在每个请求上设置过滤器集viewbag属性 IsAuthenticated , UserName 。与第一个选项一样,您的布局将使用这些viewbag属性来构建菜单。更干净,更方便。
答案 1 :(得分:0)
我没有直接操作_Layout页面,而是创建了一个_LoginPartial,与您在创建应用程序时选择“个人用户帐户身份验证”时生成的_LoginPartial相同。
<强> _LoginPartial.cshtml:强>
@if (Context.User.Identity.IsAuthenticated)
{
<ul class="nav navbar-nav navbar-right">
<li>
<a asp-area="" asp-controller="User" asp-action="Logout">Logout</a>
</li>
</ul>
}
else
{
<ul class="nav navbar-nav navbar-right">
<li><a asp-area="" asp-controller="User" asp-action="Register">Register</a></li>
<li><a asp-area="" asp-controller="User" asp-action="Login">Log in</a></li>
</ul>
}
然后我在_Layout.cshtml的导航栏中渲染了局部视图:
<nav class="navbar navbar-fixed-top">
<div class="container">
<div class="collapse navbar-collapse" id="navigation-index">
<ul class="nav navbar-nav navbar-right">
@await Html.PartialAsync("_LoginPartial")
</ul>
</div>
</div>
</nav>