2008-10-20 45 views
35

En MonoRail puede cancelar CancelLayout() para no renderizar el diseño. En ASP.NET MVC, la única forma de afectar el diseño parece ser pasar el nombre del diseño al método View() como View ("myview", "mylayout"); solo parece que pasar nulo o una cadena vacía no hace lo que yo quisiera.¿Deshabilitar diseño en ASP.NET MVC?

Terminé creando un diseño vacío que acaba de representar el contenido, pero parece tonto.

"No procesar el diseño" significa exactamente eso. En el motor de vista de formularios web, llaman diseños a "páginas maestras". Quiero mostrar solo la vista de mi acción y no rodearlo con la página maestra.

+0

Si no puede explicar exactamente lo que está buscando, no obtendrá otras respuestas. ¿A qué te refieres con "no renderizar el diseño"? – Will

+0

La pregunta es bastante clara para mí. –

+0

Tener que crear un diseño vacío puede parecer tonto, pero ¿de qué otro modo el motor de formularios web sabe cómo realizar el pedido en las secciones de contenido de asp.net? Creo que esto es más un problema con el motor de visualización de formularios web que está teniendo. – Min

Respuesta

1

Parece que esto era imposible en la versión de ASP.NET MVC que estaba preguntando acerca.

+0

¿Cuál era su versión de Asp.Net? –

+1

Fue hace 7 años. No recuerdo, pero probablemente 2. –

0

Puede crear un ActionResult personalizado que haga prácticamente cualquier cosa. ActionResult controla lo que se devuelve al cliente como respuesta. Sería trivial crear una clase que extienda ActionResult que no haga nada.

+0

Él no quiere un resultado vacío, quiere un resultado sin un diseño. – Matt

+1

Guau, eso fue útil. ¿Y un ActionResult personalizado no podría hacer esto? – Will

0

Si no desea mostrar contenido a la secuencia de salida, simplemente devuelva EmptyResult de su acción en lugar de ViewResult.

+0

Él no quiere un resultado vacío, quiere un resultado sin un diseño. – Matt

+0

Ah, esa edición se agregó más tarde. –

+0

Probablemente valga la pena eliminar esta respuesta, podría valer la pena agregar un comentario sobre lo que EmptyResult es –

0

¿Necesita su vista tener una página maestra en absoluto? ¿Son una característica opcional de WebForms? Además, ¿estás renderizando html dentro de tu vista?

No tiene sentido renderizar una página ASPX que se escribió con una página maestra en mente sin la página maestra, ya que los controles de contenido no están necesariamente en el orden correcto.

+0

Puede reutilizar vistas asignando la página maestra en tiempo de ejecución. Lo que el OP está preguntando es cómo renderizar la vista real sin renderizar su página maestra, presumiblemente presentando los elementos del "Contenido" en el orden en que fueron colocados en el ASPX. –

+0

Lo siento, sí, mi error. –

4

En lugar de utilizar una vista normal, cree una vista parcial. Estos pueden utilizarse por sí solos, lo que se parece mucho a CancelLayout(), o puede incorporarlos a una vista que haga referencia a la Página maestra, en cuyo caso será el diseño completo. También son útiles si desea enviar un fragmento parcial de HTML en respuesta a una solicitud de AJAX.

65

En MVC 3, se puede eliminar el código de diseño principal con:

@{ 
    Layout = "";  
    } 
+0

¿Esto está en la vista? ¿Todavía no hay forma de hacer esto desde el controlador? No es que me preocupe más, simplemente es divertido :) –

+1

también funciona en MVC 5 –

+0

@AaronJensen Se hace en _ViewStart.cshtml – Oscar

45

Al comienzo de vista añadir lo siguiente:

@{ 
    Layout = null; 
} 

Si desea hoja de estilo para permanecer, tendrá que añadir una referencia a él en esa vista.

+0

Esto funciona en la Vista Razor, pero no en el Controlador, como Aaron le preguntó originalmente. –

+0

Funciona en MVC 5, en la Vista Razor. –

6

Para desactivar esto para todas las páginas, editar el _ViewStart.cshtml (en la raíz, en la carpeta 'Vistas'), y asegurarse de que contiene lo siguiente:

@{ 
    Layout = null; 
} 

Y para habilitar la plantilla para cualquier vista específica, se puede agregar lo siguiente a.cshtml archivo para ese punto de vista, para permitir la plantilla:

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
+1

Esto me ayudó a desactivar un diseño específico de la barra lateral, pero a mantener el diseño general de mi encabezado/pie de página –

2

No tener un poco de suerte tratando de establecer el parámetro masterPage a "" o null y devolviendo una View (como yo no)?

A continuación, intente esto y utilizar en su lugar PartialView:

public ActionResult Article(string id) 
    { 
     return PartialView("~/Areas/Store/Views/CustomerService/" + id); 
    } 

que tenía que hacer esto para cargar el contenido de una vista de forma asíncrona de JS.

0

que veo en la respuesta correcta que dice que "Parece que esto era imposible en la versión de ASP.NET MVC"

Qué versión está usando? Debido a que he encontrado la solución (que tenía el mismo problema) a su problema

lo tanto, para desactivar el layout de la página, se debe utilizar:

@{ 
    Layout = null; 
} 

Y, como se sugiere here, esto podría resolver su problema :

public ActionResult Index() 
{ 
    SampleModel model = new SampleModel(); 
    //Any Logic 
    return View("Index", "_WebmasterLayout", model); 
}