Vista de Razor sin diseño


81

¿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>

¿Ves la palabra nullen la página renderizada?
SLaks

¿Dónde está configurando el diseño predeterminado?
SLaks

¿Tiene un _viewstart.cshtml en este directorio? Tuve el mismo problema que tienes cuando intenté usar _viewstart. Luego lo renombré _mydefaultview, lo moví al directorio views / shared, 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ó.
DMulligan

por favor configúrelo como una respuesta y la marcaré como correcta. esto debe ser un error en la navaja, seguramente?

No estoy seguro de si es un error, los _viewstarts están destinados a no sobrescribirse o si hicimos algo mal. También me gustaría saberlo.
DMulligan

Respuestas:


14

¿Tiene un _ViewStart.cshtmlen este directorio? Tuve el mismo problema que estás teniendo cuando intenté usar _ViewStart. Luego lo renombré _mydefaultview, lo moví al Views/Shareddirectorio 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ó.


Eso suena raro. El _ViewStartdebe ejecutar antes del código en la vista, por lo que este problema no debería ocurrir. ¿Tiene algo inusual en su _ViewStart?
SLaks

@ SLaks ♦ Hice un _viewstart que solo contiene "Hello World" para probar, y Hello World todavía aparece incluso si especifico Layout = null. Sin embargo, si especifico _mydefaultview como diseño, eso también se muestra. El "hola mundo" aparece entre las etiquetas donde tengo @RenderBody () en _mydefaultview.
DMulligan

4
Estás entendiendo mal _ViewStart. Mira mi respuesta.
SLaks

161

Pienso esto :

@{
    Layout = "";
 }

no es lo mismo que esto:

@{
    Layout = null;
 }

Yo uso el segundo y está funcionando, no incluye _Viewstart.


4
¿Cómo no es esta la respuesta correcta para esta pregunta?
Pinski

1
Este último funcionó para mí y fue lo primero que me vino a la mente.
Stonetip

@Pinski probablemente porque se agregó 2 años después. :)
WildJoe

35

Usted (y KMulligan) están malinterpretando _ViewStartpáginas.

_ViewStartserá 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 RenderBodyy establecer la Layoutpropiedad para que apunte a esta página _ViewStart.

Luego puede cambiar Layoutsus páginas de contenido y los cambios entrarán en vigencia.


bueno mi _Layout.cshtmlcontiene todos los diseños básicos. y _ViewStart.cshtmlllama 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.
Wahid Masud

23

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;


21

La lógica para determinar si una Vista debe usar un diseño o no NO debe estar en _viewStartni en View. Establecer un valor predeterminado en _viewStartestá 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).


Esto es contrario a lo que dice Scott Gu aquí weblogs.asp.net/scottgu/asp-net-mvc-3-layouts . 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 devicesClaramente 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.
rismo

Mi preferencia es ceñirme a los patrones de diseño. Puede lanzar el acceso a la base de datos en su vista, también es una mala práctica o "una cuestión de preferencia".
Erik Philips

Esa es una respuesta bastante hiperbólica como lo es la declaración "agregar cualquier lógica de diseño en la vista / inicio de vista evita que esa vista se use en cualquier otro lugar". Depende completamente de la aplicación en cuestión. Hay innumerables ejemplos en los que una vista determinada no depende de su archivo de diseño (maestro). El maestro simplemente está ahí para algunas marcas o navegación y todo lo que podríamos querer hacer es cambiar entre un diseño móvil y de escritorio de eso (diseños fluidos a un lado). Incluso se podría argumentar que realmente se rompe SRP al hacer que un controlador también sea responsable de cambiar los diseños en este contexto.
rism

No veo su punto de vista en su última declaración. La vista es presentación de datos. Cualquier lógica en esa vista significa que no se puede usar en otro lugar y evita la prueba de esa lógica que normalmente sucedería en el controlador. El controlador ya tiene lógica integrada en MVC ( IsAjaxRequest o ChildActionOnly ) para determinar la presentación correcta.
Erik Philips

1
Aquí estamos hablando de _ViewStart, que son específicos de ViewResult. Así que .. may or may not (JSON/XML) not even be Html rendered by a View Engineno 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.
rism

11

Utilizar:

@{
    Layout = null;
 }

para deshacerse del diseño especificado en _ViewStart.


2

Simplemente cree la vista como una vista parcial para que no se utilice ningún archivo de diseño.


2

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.


2

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";
}

-2

Si está trabajando con aplicaciones, pruebe la solución de limpieza. Arreglado para mí.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.