2012-05-11 12 views
5

私はlayoutのページに変数を設定する必要があります。例:レイアウトページへのデータの受け渡し

@ModelType KarateAqua.schoolModel 

<html> 
    <body> 

     @RenderBody() 

     <div id="footer"> 
      <div class="content"> 
       <div class="bottom_logo"> 
        <a href="/"><span class="inv">@Model.schoolName</span></a> 
       </div> 
      </div> 
     </div> 
    </body> 
</html> 

私はすべてのActionResultでこれを移入する必要はありません。一度だけデータをlayoutページに渡してすべてのインスタンスに対して実行する方法はありますか?

+0

最高の答えは:http://stackoverflow.com/questions/13225315/pass-data-to-layout-that-are-common-to-all-pages – DeeArgee

答えて

6

OK、あなたは部分図を利用することができたら、これを設定することにしたいからです。しかし、あなたの部分図が

@model KarateAqua.schoolModel 

<div class="bottom_logo"> 
<a href="/"><span class="inv">@Model.schoolName</span> 
</div> 

コントローラ

のようになります

(セクションが_layoutページに散在しようとしている場合は理想的ではないかもしれない)、ニーズに応じて、あなたは、いくつかの部分図を持っている必要がありますあなたの_layout.cshtml代わりに

public class SchoolController : Controller 
{ 
    public ActionResult Index() 
    { 
      //get schoolModel 
      return PartialView(schoolModel); 
    } 
} 

あなたは

@Html.Action("Index","School") 
を挿入する部分ビューを持ちたい、この行
2

ViewBagまたはViewDataを使用して、レイアウトページにデータを渡すことができます。

レイアウト

<html> 
<body> 
@RenderBody() 

<div id="footer"> 
<div class="content"> 
<div class="bottom_logo"> 
<a href="/"><span class="inv">@ViewBag.schoolName</span> 
</div></div></div> 
</body> 
</html> 

コントローラ

public ActionResult Index(){ 
    ViewBag.schoolName = "Bayside Tigers"; 
    return View(); 
} 
+2

しかし、私は各コ​​ントローラアクション? –

+0

はい、アクションごとにモデルを返す必要があるように、 – Gabe

+4

ソフトウェア設計が不良です。 – mcserep

13

アクションフィルターを作成し、コントローラークラスを装飾します。アクションフィルタの内部では、レイアウトに使用可能な値をビューバックに配置できます。

これは各リクエストで実行されるため、各アクションで値を設定する必要はありません。通常はレイアウトを使用せず、ビューバック値を設定しない子リクエストやAjaxリクエストなどのものを探して無視することができます。以下は

は、私はあなたがレイアウトページにコードブロックを開き、埋めることができViewBag経由

public class CurrentUserAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     // Don't bother running this for child action or ajax requests 
     if (!filterContext.IsChildAction && !filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 

      if (filterContext.HttpContext.Session != null) 
      { 
       var currentUser = filterContext.HttpContext.Session["CurrentUser"] as CurrentUser; 
       if (currentUser != null) 
       { 
        filterContext.Controller.ViewBag.CurrentUser = currentUser; 
       } 
      } 
     } 
    } 


} 
+0

これは完全にきれいではありません(強く型付けされていないなど)が、私が見つけたのはきれいです。ありがとう。 –

5

をセッションからオブジェクトをコピーして、レイアウトにそれを利用できるように作成された属性のサンプルですそこに目的を置く。これは、レイアウトページが使用されるたびに実行されます。利点は、あなたのコントローラ上で何かを変更する必要がないことです:あなたは常にあなたのヘッダーの部分図を返すアクションを作成することができ

@{ 
    KarateAqua.schoolModel data = YourBusinessLayer.Method(); 
} 

<html> 
<body> 

    @RenderBody() 

    <div id="footer"> 
     <div class="content"> 
      <div class="bottom_logo"> 
       <a href="/"><span class="inv">@data.schoolName</span></a> 
      </div> 
     </div> 
    </div> 
</body> 
</html> 
1

ちょうどあなたのlayoutページにこれを追加します。

<html> 
    <head> 
    </head> 
     <body> 
      @{ Html.RenderAction("header", "MyController", new { area = "" }); } 

      @RenderBody() 
//... 
0

あなたのレイアウトページ:

@ViewBag.LayoutVar 

あなたにHomeController:

public class HomeController : BaseController 
{ 
    //Here some logic... 
} 

あなたBaseController

namespace ProjectName.Controllers 
{ 
    public class BaseController : Controller 
    { 

     public YetkiController() 
     { 
      //This parameter is accessible from layout 
      ViewBag.LayoutVar = "Suat"; 
     } 
    } 
} 

ロジックは簡単です:あなたは、レイアウトで使用するすべてのグローバルパラメータを含んBaseControllerを作成します。 (ユーザ名または他のデータベースのパラメータと同様に)

あなたは、現在のコントローラにすべてのパラメータを取得する(コール)BaseControllerを継承します。

1

私は、異なるページ間でデータを永続化するためにHTTP Sessionを使用 -

//Opening page controller 
public ActionResult Index() 
{  
    Session["something"]="xxxx"; 
    return View(); 
} 

共有_layoutページでは、

//persistent data 
<p>Hello, @Session["something"]!</p> 

希望しますが、設定したデフォルトのページから別のページから開始するとうまくいきません。

関連する問題