2011-05-09 27 views
33

Tengo una vista compartida en mi _Layout.cshtml para mi encabezado llamado "_Header.cshtml".Asp.Net Mvc - Cómo tener un "controlador" en la vista compartida

Me gustaría mostrar texto e imágenes de la base de datos, por lo que necesito que mi controlador vaya a la base de datos y lo devuelva a _Header.cshtml.

¿Cómo puedo hacer eso porque el controlador llamado siempre es diferente en cada página que va el usuario? ¿Hay alguna forma de tener un controlador con vista compartida?

Aquí es el _Layout.cshtml

<div id="header"> 
     <div id="title"> 
      @Html.Partial("_Header") 
     </div> 

     <div id="logindisplay"> 
      @Html.Partial("_CultureChooser") 
      <br /> 
      @Html.Partial("_LogOnPartial") 
     </div> 

     <div id="menucontainer"> 
      @Html.Partial("_MenuPartial") 
     </div> 
    </div> 

    <div id="main"> 
     @RenderBody() 
     <div id="footer"> 
     </div> 
    </div> 

</div> 

Respuesta

52

En su acción Contoller podría especificar el nombre de la vista:

public class MenuController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Header() 
    { 
     var model = ... // go to the database and fetch a model 
     return View("~/Views/Shared/_Header.cshtml", model); 
    } 
} 

En su _Layout.cshtml en lugar de @Html.Partial("_Header") haga esto:

@Html.Action("Header", "Menu") 
+0

Agregué el _Layout.cshtml en la pregunta. No está en un clic, está en todas partes en el sitio web. –

+0

@Daok, ¿qué quiere decir con un * clic *? Puede usar el método de ayuda '@ Html.Action' en su diseño que llamará a la acción secundaria en el controlador correspondiente. Esto es más poderoso que un simple 'Html.Partial' ya que aquí tiene la posibilidad de definir un controlador/modelo separado y una vista para esta sección del sitio que se repite en todas partes y que es independiente del controlador principal. Puede consultar la siguiente publicación de blog sobre acciones de niños: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx –

+0

Gracias, todavía tengo que aprender MVC: PI tiene este error ahora : Error al ejecutar la solicitud secundaria para el controlador 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'. –

2

crear una acción en una de sus controladores para hacer que la vista de encabezado, entonces simplemente llamar @ Html.RenderAction ("cabecera") dentro de la _Layout.cshtml.

También puede pasar un modelo al método RenderAction si es necesario.

9

... 1 año después simplemente le gustaría añadir una cosa a Dimitrov responde. Puede hacer que el controlador de un poco más limpio:

public class MenuController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Header() 
    { 
     var model = ... // go to the database and fetch a model 
     return Partial("_Header", model); 
    } 
} 
+0

Me salvaste, solo creo que debe ser {return PartialView ("_ Encabezado", modelo); } No encontré el método parcial. ¿Estoy equivocado? – QMaster

0

espero que la pregunta que has hecho es igual .... podemos tener un controlador para un compartido la vista de diseño.

Simple respuesta es No.

Para lograr este objetivo hay que crear una vista parcial para el mismo propósito y ponerlo en que ha compartido Diseño. De esta forma puede lograrlo Objetivo

Cuestiones relacionadas