在视图和控制器之间传递公共数据

时间:2016-10-11 09:56:36

标签: asp.net-mvc-4

我是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);
}

1 个答案:

答案 0 :(得分:0)

IsuserLoggedIn是一个字段,而不是属性,DefaultModelBinder无法设置其值(它没有设置器),因此该属性初始化为falseIndex()方法(bool的默认值)

更改基本视图模型以使其成为属性

public abstract class ViewModelBase
{
    public bool IsuserLoggedIn { get; set; }
}

旁注:只需使用@if (Model != null && Model.IsuserLoggedIn) - 无需将bool投射到bool