2012-05-11 13 views
5

Ho una pagina layout che ha le variabili che devono essere riempiti. Esempio:Passaggio di dati ad un layout di pagina

@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> 

non voglio per popolare questo in ogni ActionResult. C'è un modo per passare i dati a una pagina layout una volta e farlo per tutte le istanze?

+0

La risposta migliore è: http://stackoverflow.com/questions/13225315/pass-data-to-layout-that-are-common-to-all-pages – DeeArgee

risposta

6

OK dal momento che si desidera che questo sia impostato una volta che si può fare uso di una vista parziale. Tuttavia a seconda delle esigenze è necessario avere diverse viste parziali (potrebbe non essere l'ideale se le sezioni stanno per essere sparso in tutta la pagina _layout)

vostra visione parziale sarà simile

@model KarateAqua.schoolModel 

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

controller

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

al tuo posto _layout.cshtml questa riga in cui si desidera avere la vista parziale da inserire

@Html.Action("Index","School") 
2

È possibile utilizzare ViewBag o ViewData per passare i dati alle pagine di layout.

layout

<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> 

controller

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

Ma dovrei farlo per ogni controller azione? –

+0

Sì, proprio come si dovrebbe restituire un modello per ogni azione. – Gabe

+4

Progettazione software scadente. – mcserep

13

Crea un filtro di azioni e decora le tue classi di controller. All'interno del filtro azione hai accesso a mettere i valori nel viewbag disponibili per il tuo layout.

Questo verrà eseguito su ogni richiesta e non sarà necessario impostare i valori in ogni azione. Puoi cercare e ignorare cose come una richiesta figlio e richieste ajax che in genere non usano il layout e non impostano i tuoi valori di viewbag per quelle.

Qui di seguito è un esempio di un attributo che ho creato per copiare un oggetto dalla sessione e renderlo disponibile per il layout tramite il 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

Questo non è perfettamente pulito (non fortemente digitato, ecc.), Ma è il più pulito che ho trovato. Grazie. –

5

È possibile aprire un blocco di codice nella pagina di layout e riempire il oggetto lì. Questo verrà eseguito ogni volta che viene utilizzata la pagina di layout. Il vantaggio è che non c'è bisogno di modificare nulla sul controller:

@{ 
    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

Si può sempre creare un'azione che restituisce una visione parziale della vostra testata.

Basta aggiungere questo alla tua layout pagina:

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

      @RenderBody() 
//... 
0

il layout di pagina:

@ViewBag.LayoutVar 

tuo HomeController:

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

Il tuo BaseController

namespace ProjectName.Controllers 
{ 
    public class BaseController : Controller 
    { 

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

logica è semplice: Si crea BaseController che comprende ogni parametri globali si intende utilizzare nel layout. (Come nome utente o altri parametri basati sui dati)

È possibile ereditare (chiamare) BaseController per ottenere tutti i parametri nel controller corrente.

1

ho usato HTTP Session a persistere i dati tra le diverse pagine -

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

Nella condivisa _layout pagina;

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

Spero che questo aiuti, ma non funzionerà se si parte da una pagina diversa da quella di default che è stata impostata.

Problemi correlati