如何从我的控制器访问共享_Layout视图中的元素(asp.net core mvc)

时间:2017-03-11 18:47:51

标签: asp.net-core-mvc

我正在编写一个应用程序,并且我已经使用cookie中间件实现了用户登录功能。我的共享_Layout视图有一个导航栏,其中包含“注册”,“登录”和“注销”的链接。问题是导航栏上始终显示“登录”和“注销”,无论是否登录,所以我需要能够从我的控制器访问共享视图页面中的html元素以隐藏登录时“登录”按钮,并在未登录时隐藏“注销”按钮。

2 个答案:

答案 0 :(得分:1)

  

我需要能够从我的控制器

访问共享视图页面中的html元素

这不是你在MVC中做的事情。在MVC中,控制器将静态类型或动态(视图包)数据传递给视图。然后视图使用此数据构建它想要的任何HTML。

第一个选项是布局菜单(在_layout视图中)使用viewbag中的一些属性,如 IsAuthenticated UserName 。然后,您必须在每个动作上设置这些viewbag属性,这不是很方便。

第二个选项,在应用程序启动时注册一个全局过滤器,该过滤器将应用于所有控制器操作。根据身份验证状态,在每个请求上设置过滤器集viewbag属性 IsAuthenticated UserName 。与第一个选项一样,您的布局将使用这些viewbag属性来构建菜单。更干净,更方便。

How to register a global filter in ASP.NET Core

How to set viewbag properties from a filter

答案 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>