asp.net-mvc - renderbody - render body
¿Cómo puedo especificar diferentes diseños en el archivo ViewStart de la máquina de afeitar ASP.NET MVC 3? (3)
Este método es la forma más sencilla para que los principiantes controlen la representación de Diseños en su aplicación ASP.NET MVC. Podemos identificar el controlador y representar los diseños como 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;
}
Lea el artículo completo here "Cómo representar un diseño diferente en ASP.NET MVC"
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 para el lado Miembro.
Para simplificar, digamos que toda la lógica de cada uno de estos sitios está perfectamente integrada en 2 controladores distintos.
- Controlador público
- Controlador de personal
Y que cada uno tiene un diseño correspondiente para todas las vistas debajo de cada una.
- _PublicLayout.cshtml
- _StaffLayout.cshtml
¿Cómo uso el archivo _ViewStart.cshtml para especificar que todas las Vistas / Acción en "Público" usan PublicLayout y todo lo que en "Personal" usa StaffLayout?
¡Gracias!
Podría colocar 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, puede colocar 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 más es un filtro de acción personalizado que anularía el diseño. Como puedes ver muchas posibilidades para lograrlo. Depende de usted elegir cuál encaja mejor en su escenario.
ACTUALIZAR:
Tal como se solicita 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 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();
}
Un método más es definir el diseño dentro de la vista:
@{
Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
}
Más formas de hacer, se pueden encontrar here , espero que esto ayude a alguien.