2016-10-11 18 views
-1

私はASP.NET MVCを初めて使用しています。アプリケーション内のすべてのページに共通のデータを渡したい以下はPass data to layout that are common to all pagesです。レイアウトやコントローラで値を取得できません。ビューとコントローラ間で共通のデータを渡す

ユーザがシステムにログインしたときに、フラグ 'UserhasLoggedIn'を設定して別のコントローラアクションにリダイレクトします。レイアウトで、フラグがfalseに設定されていればメニュー項目を表示しないでください。ページがホームインデックスにリダイレクトされると、 '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 indexアクション:真のAにIsUserLoggedInを取得することができませんレイアウトでさえもない。

public ActionResult Index(HomeViewModel baseModel) 
{ 
    baseModel.FirstName = "First"; 
    baseModel.LastName = "Last Name"; 
    return View(baseModel); 
} 

答えて

0

IsuserLoggedInフィールドではなくプロパティとDefaultModelBinderができないセットその値(それはセッターを持っていない)ので、プロパティはIndex()方法でfalseとして初期化される(boolのデフォルト値)

あります

変更それ財産

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

サイドノート作るために、ベースビューモデル:ちょうど@if (Model != null && Model.IsuserLoggedIn)使用 - Tをここにキャストする必要はありません。boolbool

+0

最初はページの読み込み値がfalseの場合です。しかし、ログインが成功すると、アカウントコントローラのログインアクションで値をTrueに設定します。それがモデルとレイアウトに反映されない理由をtrueに設定した後 – user2323308

+0

あなたは答えを読んだことがありますか? 'DefaultModelBinder'が** SET ** itにできないので'Index'メソッドの' IsuserLoggedIn'の値は 'false'です –

+0

Indexメソッドで明示的に値をtrueに設定する必要はありますか? – user2323308

関連する問題