2011-03-01 8 views
291

Me gustaría tener 2 diseños separados en mi aplicación. Supongamos que uno es para la sección pública del sitio web y el otro es para el lado de los miembros.¿Cómo especifico los diferentes diseños en el archivo ASP.NET MVC 3 razor ViewStart?

Por simplicidad, digamos que toda la lógica para cada uno de estos sitios está perfectamente integrada en 2 controladores distintos.

  • PublicController
  • StaffController

Y que cada uno tiene un diseño correspondiente por todos la vista en cada una.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

¿Cómo se utiliza el archivo _ViewStart.cshtml para especificar que todos los de Vista/Acción en "Público" utilizar el PublicLayout y todo bajo "personal" usar el StaffLayout?

Gracias!

+4

Sólo en caso de:. Si desea eliminar el diseño de una vista de 'Razor' determinada, simplemente configure' Layout = null; ' –

+3

Al igual que un comentario en su ejemplo, probablemente no debería tener controladores llamados Public and Staff. Los controladores se implementan más a menudo como el punto de entrada a una acción similar a CRUD en ciertas entidades comerciales clave, como EventController, UserController o similares. Si su aplicación es reas grandemente, la responsabilidad de un controlador público/personal sería amplia. Considere las áreas en su lugar. http://msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx Es posible que tenga conocimiento de esto, pero alguien más leyendo esto podría obtener la idea equivocada, por lo tanto, solo para el registro. – Alex

Respuesta

516

Se puede poner un archivo _ViewStart.cshtml dentro de la carpeta /Views/Public que anular la opción por defecto en la carpeta /Views y especificar el diseño deseado:

@{ 
    Layout = "~/Views/Shared/_PublicLayout.cshtml"; 
} 

Por analogía se podría poner otro archivo _ViewStart.cshtml dentro de la carpeta /Views/Staff con :

@{ 
    Layout = "~/Views/Shared/_StaffLayout.cshtml"; 
} 

también puede especificar el diseño se debe usar para devolver una vista interior de una acción del controlador, pero eso es por acción:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel); 

Otra posibilidad es un filtro de acción personalizado que anularía el diseño. Como puede ver, hay muchas posibilidades para lograr esto. Depende de usted elegir cuál se ajusta mejor a su escenario.


ACTUALIZACIÓN:

como se solicita en la sección de comentarios que aquí es un ejemplo de un filtro de acción que elegir una página principal:

public class LayoutInjecterAttribute : ActionFilterAttribute 
{ 
    private readonly string _masterName; 
    public LayoutInjecterAttribute(string masterName) 
    { 
     _masterName = masterName; 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 
     var result = filterContext.Result as ViewResult; 
     if (result != null) 
     { 
      result.MasterName = _masterName; 
     } 
    } 
} 

y luego decorar un controlador o una acción con este atributo personalizado que especifica el diseño que desea:

[LayoutInjecter("_PublicLayout")] 
public ActionResult Index() 
{ 
    return View(); 
} 
+0

@Justin, también dije esto en mi respuesta :-) Ejemplo que viene ... –

+1

@DarinDimitrov Donde crearé 'LayoutInjecterAttribute'. ? ¿Hay alguna ubicación en particular? – kbvishnu

+2

@VeeKeyBee, podrías ponerlo dentro de una subcarpeta 'ActionFilters'. –

14

Este método es la forma más simple para que los principiantes controlen el renderizado de Layouts en su aplicación ASP.NET MVC. Podemos identificar el controlador y renderizar los diseños como el controlador par, para ello podemos escribir nuestro código en el archivo _ViewStart en el directorio raíz de la carpeta Vistas. A continuación se muestra un ejemplo que muestra cómo se puede hacer.

@{ 
      var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString(); 
      string cLayout = ""; 
      if (controller == "Webmaster") { 
        cLayout = "~/Views/Shared/_WebmasterLayout.cshtml"; 
       } 
       else { 
       cLayout = "~/Views/Shared/_Layout.cshtml"; 
       } 
     Layout = cLayout; 
     } 

Leer artículo completo here "el modo de hacer diferente diseño en ASP.NET MVC"

27

Uno más método consiste en definir el diseño interior de la Vista:

@{ 
    Layout = "~/Views/Shared/_MyAdminLayout.cshtml"; 
    } 

más maneras de hacer, se puede encontrar here, espero que esto ayude a alguien

+1

Esto no funcionará: sin el _ViewStart.cshtml por separado, su vista seguirá mostrándose dentro del método @RenderBody() en el otro diseño. – Tillman32

+0

Esto! ¿Por qué todos presentan estos procesos extremadamente complejos cuando todo lo que necesitas hacer es esto? –

Cuestiones relacionadas