¿Cómo es que cuando tengo Layout = null;
en mi vista, todavía se muestra el diseño predeterminado?
¿Hay algún truco para evitar que haga eso?
Aquí está mi vista sin diseño:
@{
Layout = "";
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
@{Html.RenderAction("Head", "Header");}
</head>
<body>
<div>
Home
</div>
</body>
</html>
¡Aquí está la salida renderizada!
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="/Content/Site.css" rel="stylesheet" type="text/css" />
<script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
<script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
</head>
<body>
header
</body>
</html>
</head>
<body>
<div>
Home
</div>
</body>
</html>
asp.net-mvc
asp.net-mvc-3
layout
razor
Greg B
fuente
fuente
null
en la página renderizada?Respuestas:
¿Tiene un
_ViewStart.cshtml
en este directorio? Tuve el mismo problema que estás teniendo cuando intenté usar _ViewStart. Luego lo renombré _mydefaultview, lo moví alViews/Shared
directorio y cambié a especificar que no hay vista en los archivos cshtml donde no lo quiero, y especifique _mydefaultview para el resto. No sé por qué fue necesario, pero funcionó.fuente
_ViewStart
debe ejecutar antes del código en la vista, por lo que este problema no debería ocurrir. ¿Tiene algo inusual en su _ViewStart?_ViewStart
. Mira mi respuesta.Pienso esto :
@{ Layout = ""; }
no es lo mismo que esto:
@{ Layout = null; }
Yo uso el segundo y está funcionando, no incluye _Viewstart.
fuente
Usted (y KMulligan) están malinterpretando
_ViewStart
páginas._ViewStart
será siempre ejecutar, antes de que comience su página.Está destinado a ser utilizado para inicializar propiedades (como
Layout
); generalmente no debe contener marcado. (Dado que no hay forma de anularlo).El patrón correcto es crear una página de diseño separada que llame
RenderBody
y establecer laLayout
propiedad para que apunte a esta página_ViewStart
.Luego puede cambiar
Layout
sus páginas de contenido y los cambios entrarán en vigencia.fuente
_Layout.cshtml
contiene todos los diseños básicos. y_ViewStart.cshtml
llama al_Layout.cshtml
. cada módulo de mi aplicación tiene su propia página de diseño, pero esos diseños utilizan el archivo main_Layout.cshtml
. Como la aplicación mvc comienza desde viewstart, supongo que mi única solución fue comentar todo dentro de viewstart. y eso no causa ningún problema adicional porque otras páginas ya se estaban usando_Layout.cshtml
. bastante simple.Creo que es mejor trabajar con "vistas" individuales, estoy tratando de pasar de PHP a MVC4, es realmente difícil pero estoy en el camino correcto ...
Respondiendo a su pregunta, si trabajará en páginas individuales, simplemente edite _ViewStart.cshtml
@{ Layout = null; }
Otro consejo si tiene problemas con la ruta CSS ...
Pon "../" antes de la URL
Estos son los 2 problemas que tengo hoy, ¡y los resuelvo de esa manera!
Saludos;
fuente
La lógica para determinar si una Vista debe usar un diseño o no NO debe estar en
_viewStart
ni enView
. Establecer un valor predeterminado en_viewStart
está bien, pero agregar cualquier lógica de diseño en la vista / viewstart evita que esa vista se use en cualquier otro lugar (con o sin diseño).La acción de su controlador debe:
return PartialView()
Al poner este tipo de lógica en la Vista, se rompe la regla del principio de responsabilidad única en M (datos), V (visual), C (lógica).
fuente
we could write code within our _ViewStart.cshtml file to programmatically set the Layout property for each View ... we could vary the Layout template that we use depending on what type of device is accessing the site – and have a phone or tablet optimized layout for those devices
Claramente está promocionando _viewstart como un lugar para usar la lógica para cambiar diseños (también menciona controladores y filtros de acción). Así que es más una cuestión de preferencia que absoluta: dónde cambiar los diseños... may or may not (JSON/XML) not even be Html rendered by a View Engine
no tiene relación. Un _layout es solo una vista que envuelve una vista. (No todos comienzan con<!DOCTYPE html>
). Por lo tanto, puede ser perfectamente factible que _ViewStart active y desactive _layouts de acuerdo con alguna propiedad, es decir, el día de la semana. En un contexto dado, podría romper SRP para que ControllerA para una ViewA tome alguna determinación sobre en qué página _layout inyectar ViewA, ya que eso está más allá del alcance de SRP. Existe solo para admitir ViewA <> ViewModelA.Utilizar:
@{ Layout = null; }
para deshacerse del diseño especificado en _ViewStart.
fuente
Simplemente cree la vista como una vista parcial para que no se utilice ningún archivo de diseño.
fuente
Quería mostrar la página de inicio de sesión sin el diseño y esto funciona bastante bien para mí. (Este es el archivo _ViewStart.cshtml) Necesita configurar ViewBag.Title en el Controlador.
@{ if (! (ViewContext.ViewBag.Title == "Login")) { Layout = "~/Views/Shared/_Layout.cshtml"; } }
Sé que es un poco tarde, pero espero que esto ayude a algún cuerpo.
fuente
Procedimiento 1: Controle la representación de Layouts utilizando el archivo _ViewStart en el directorio raíz de la carpeta Vistas
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 renderizar los Layouts como controlador par, para hacer esto 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 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; }
Procedimiento 2: Establecer el diseño volviendo de ActionResult
Una de las grandes características de ASP.NET MVC es que podemos anular la representación del diseño predeterminado devolviendo el diseño de ActionResult. Por lo tanto, esta también es una forma de representar diferentes diseños en su aplicación ASP.NET MVC. El siguiente ejemplo de código muestra cómo se puede hacer.
public ActionResult Index() { SampleModel model = new SampleModel(); //Any Logic return View("Index", "_WebmasterLayout", model); }
Procedimiento 3: Diseño por vista (definiendo el diseño dentro de cada vista en la parte superior)
ASP.NET MVC nos proporciona una gran característica y capacidad de fax para anular la representación del diseño predeterminado definiendo el diseño en la vista. Para implementar esto, podemos escribir nuestro código de la siguiente manera en cada Vista.
@{ Layout = "~/Views/Shared/_WebmasterLayout.cshtml"; }
Procedimiento 4: Colocando el archivo _ViewStart en cada uno de los directorios
Esta es una forma muy útil de establecer diferentes diseños para cada controlador en su aplicación ASP.NET MVC. Si queremos establecer el diseño predeterminado para cada directorio, podemos hacerlo colocando el archivo _ViewStart en cada uno de los directorios con la información de diseño requerida como se muestra a continuación:
@{ Layout = "~/Views/Shared/_WebmasterLayout.cshtml"; }
fuente
Si está trabajando con aplicaciones, pruebe la solución de limpieza. Arreglado para mí.
fuente