所以基本上我想要传递一个bool值从控制器的动作到布局视图这样我就可以根据这个bool值显示登录按钮;含义bool IsLoggedin = false表示显示登录按钮else那意味着IsLoggedin = true那么不显示Login而显示Sign out。输入图片描述
,正如您在图片中看到的,它在索引视图中检测到我没有通过我提到的bool登录。在我的索引操作中:-
if (Logged == false)
{
ModelState.AddModelError("", "You need to Login before you can add an item to cart");
}
我还实现了相同的系统来检测登录的帐户是否是我的索引视图中的员工
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ProductName)
</td>
<td>
@Html.DisplayFor(modelItem => item.UnitPrice)
</td>
<td>
@Html.DisplayFor(modelItem => item.InStock)
</td>
<td>
<div>
@{ if (IsEmployee == true)
{
@Html.ActionLink("Edit", "Edit", new { id = item.ProductID }, new { @class = "btn btn-sm btn-info" })
@Html.ActionLink("Details", "Details", new { id = item.ProductID }, new { @class = "btn btn-sm btn-primary" })
@Html.ActionLink("Delete", "Delete", new { id = item.ProductID }, new { @class = "btn btn-sm btn-danger" })
}
else
{
using (Html.BeginForm("AddToCart", "Home", FormMethod.Post, new { @class = "myForm" }))
{
<input type="hidden" name="Id" value="@item.ProductID" } />
<label for="Quant">Quantity</label> <input type="number" min="1" max="@item.InStock" value="0" name="Quant" class="MyInput" />
<input type="submit" value="Add to cart" class="btn btn-sm myButton" } />
}
}
}
</div>
</td>
</tr>
}
我想对Layout.cshtml做同样的事情
很抱歉让它变长了;这是我之前第一次提交问题;我是新来的……生活
我不确定您是否使用Asp.Net Core
中的身份来实现登录,如果是,您可以将SignInManager<T>
注入到您的布局中,并使用SignInManager.IsSignedIn(User)
自动检测用户是否已登录。
但是如果你想从控制器的动作传递一个bool值到布局,Session更适合你的情况,请参考这段代码:
创建一个局部视图并将IHttpContextAccessor
注入其中:
@inject IHttpContextAccessor ContextAccessor
<li class="nav-item">
@if (Convert.ToBoolean(ContextAccessor.HttpContext.Session.GetString("Login")) == true)
{
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="SignOut">Sign out</a>
}
else
{
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="LoggedIn">Log in</a>
}
</li>
不要忘记在program.cs
HttpContextAccessor
builder.Services.AddHttpContextAccessor();
然后在布局页
中引用这个局部视图<partial name="_MyLogin"/>
在您的登录操作中,您需要:
HttpContext.Session.SetString("Login","true");
在您的注销操作中,您需要:
HttpContext.Session.SetString("Login","false");
现在,在您访问登录方法之后,导航栏将不会更改,直到您访问注销操作。