2012-05-11 26 views
5

Tengo una página layout que tiene variables que deben cumplimentarse. Ejemplo:Pasar datos a una página de diseño

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

no quiero poblar esto en cada ActionResult. ¿Hay alguna manera de pasar datos a una página layout una vez y hacerlo para todas las instancias?

+0

La mejor respuesta es: http://stackoverflow.com/questions/13225315/pass-data-to-layout-that-are-common-to-all-pages – DeeArgee

Respuesta

6

bien, ya que quieren que esto se establecerá una vez que se puede hacer uso de una visión parcial. Sin embargo, dependiendo de sus necesidades, tendrá que tener varios puntos de vista parciales (puede ser no es ideal si secciones van a ser dispersos a través de la página _layout)

su vista parcial se verá como

@model KarateAqua.schoolModel 

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

controlador

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

en su lugar _layout.cshtml esta línea en la que desea tener la visión parcial que se inserta

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

Puede usar ViewBag o ViewData para pasar datos a sus páginas de diseño.

Disposición

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

controlador

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

Pero tendría que hacer eso para cada controlador ¿acción? –

+0

Sí, al igual que tendrías que devolver un modelo para cada acción. – Gabe

+4

Diseño de software deficiente. – mcserep

13

Crea un filtro de acción y decora tus clases de controlador. Dentro del filtro de acción tiene acceso para poner valores en la bolsa de visualización que están disponibles para su diseño.

Esto se ejecutará en cada solicitud y no tendrá que establecer los valores en cada acción. Puede buscar e ignorar cosas como peticiones de un niño y solicitudes ajax que normalmente no usan el diseño de todos modos y no establecer sus valores de viewbag para esos.

A continuación se muestra un ejemplo de un atributo que he creado para copiar un objeto de la sesión y ponerlo a disposición de la distribución a través de la 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

Esto no está perfectamente limpio (no está fuertemente tipado, etc.), pero es el más limpio que he encontrado. Gracias. –

5

Puede abrir un bloque de código en el diseño de página y llenar el objeto allí. Esto se ejecutará cada vez que se use la página de diseño. El beneficio es que usted no tiene que cambiar nada en el controlador:

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

Siempre se puede crear una acción que devuelve una vista parcial de la cabecera.

Sólo tiene que añadir esto a su layout página:

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

      @RenderBody() 
//... 
0

su diseño de página:

@ViewBag.LayoutVar 

Su HomeController:

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

Su BaseController

namespace ProjectName.Controllers 
{ 
    public class BaseController : Controller 
    { 

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

La lógica es sencilla: Se crea BaseController que incluye cada parámetros globales que va a utilizar en el diseño. (como nombre de usuario u otros parámetros basados ​​en datos)

Hereda (llame) BaseController para obtener todos los parámetros en su controlador actual.

1

que utilizan HTTP Session para persistir los datos entre diferentes páginas -

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

En la página compartida _layout;

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

Esperanza esto ayuda pero no va a funcionar si se parte de una página diferente a la predeterminada que se ha establecido.

Cuestiones relacionadas