¿Cómo puedo especificar diferentes diseños en el ASP.NET MVC 3 razor ViewStart archivo?


Me gustaría tener 2 Diseños separados en mi aplicación. Digamos que uno es para la sección Pública del sitio web y el otro es para el lado de los Miembros.

Para simplificar, digamos que toda la lógica para cada uno de estos sitios está envuelta cuidadosamente en 2 controladores distintos.

  • PublicController
  • StaffController

Y que cada uno tiene un Diseño correspondiente para toda la vista bajo cada.

  • _PublicLayout.cshtml
  • _estafflayout.cshtml

Cómo uso el _ViewStart.archivo cshtml ¿para especificar que todas las Acciones de la vista en" Public "usen el PublicLayout y todo en" Staff " usen el StaffLayout?

Gracias!

Author: Justin, 2011-03-02

3 answers

Podría poner un archivo _ViewStart.cshtml dentro de la carpeta /Views/Public que anularía el predeterminado en la carpeta /Views y especificaría el diseño deseado:

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

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

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

También puede especificar qué diseño debe usarse al devolver una vista dentro 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 puedas vea muchas posibilidades para lograr esto. Depende de usted elegir cuál se adapta mejor a su escenario.


ACTUALIZACIÓN:

Como se solicitó en la sección de comentarios, aquí hay un ejemplo de un filtro de acción que elegiría una página maestra:

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 decora un controlador o una acción con este atributo personalizado especificando el diseño que deseas:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}
 532
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-01 23:05:54

Un método más es definir el Layout dentro de la vista:

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

Se pueden encontrar más formas de hacerlo aquí, espero que esto ayude a alguien.

 28
Author: stom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-08 11:09:44

Este método es la forma más sencilla para que los principiantes controlen la representación de diseños en su ASP.NET Aplicación MVC. Podemos identificar el controlador y renderizar los Layouts como controlador par, para ello podemos escribir nuestro código en el archivo _ViewStart en el directorio raíz de la carpeta Views. A continuación se muestra un ejemplo de 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;
         }

Lea el artículo completo aquí "Cómo renderizar diferentes Diseños en ASP.NET MVC"

 14
Author: Anil Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-08 04:29:18