我是ASP.NET MVC的新手。想要将公共数据传递给应用程序中的所有页面。关注Pass data to layout that are common to all pages。仍然无法获得布局和控制器中的值。
当用户登录系统时,我设置标志'UserhasLoggedIn'并重定向到另一个控制器动作。在布局中,我添加了检查,如果flag设置为false,则不应显示菜单项并显示LoginPage。当页面被重定向到Home Index时,它不会获得'UserhasLoggedIn'标志。
Layout.cshtml:
@using WebApplication2.Models
@model ViewModelBase
<div class="btn-toolbar" style="background-color:dimgrey; padding-left:35px;padding-top:-10px;">
@if (null != Model && (bool)Model.IsuserLoggedIn)
{
foreach (var menuItem in Model.MenuItems)
{
<div class="btn-group">
<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">menuItem.MenuName <span class="caret"></span></button>
<ul class="dropdown-menu">
@foreach (var subMenu in menuItem.SubMenu)
{
<li>@Html.ActionLink((string)subMenu.MenuName, (string)subMenu.ActionName, (string)subMenu.ControllerName)</li>
}
</ul>
</div>
}
}
<div class="btn-group pull-right" style="padding-right:35px">
@if (null == Model || !(bool)Model.IsuserLoggedIn)
{
<button class="btn btn-primary" onclick="location.href='@Url.Action("Login", "Account")'">Log in</button>
}
else
{
<button class="btn btn-primary" onclick="location.href='@Url.Action("LogOff", "Account")'">Log out </button>
}
</div>
</div>
我创建了可以使用的通用视图模型。
public abstract class ViewModelBase
{
public bool IsuserLoggedIn;
}
LoginViewModel:
public class LoginViewModel : ViewModelBase
{
[Required]
[Display(Name = "Email")]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
HomeViewModel:
public class HomeViewModel : ViewModelBase
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
AccountController登录操作:
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
return RedirectToAction("Index", "Home", new HomeViewModel() { IsuserLoggedIn = true, MenuItems=null });
}
HomeController索引操作:无法将IsUserLoggedIn设置为true,甚至不能在布局中。
public ActionResult Index(HomeViewModel baseModel)
{
baseModel.FirstName = "First";
baseModel.LastName = "Last Name";
return View(baseModel);
}
答案 0 :(得分:0)
IsuserLoggedIn
是一个字段,而不是属性,DefaultModelBinder
无法设置其值(它没有设置器),因此该属性初始化为false
在Index()
方法(bool
的默认值)
更改基本视图模型以使其成为属性
public abstract class ViewModelBase
{
public bool IsuserLoggedIn { get; set; }
}
旁注:只需使用@if (Model != null && Model.IsuserLoggedIn)
- 无需将bool
投射到bool