tutorial net mvc entre ejemplos diferencias asp asp.net-mvc razor asp.net-mvc-routing asp.net-mvc-areas

asp.net-mvc - net - web forms c# tutorial



Forzar todas las áreas para usar el mismo diseño (3)

Tengo la siguiente estructura de proyecto:

  • / Views / Shared / _Layout;

  • / Areas / Area1 / Views / ControllerName / Index;

...

  • / Areas / AreaN / Views / ControllerName / Index.

¿Hay alguna manera de obligar a todas las áreas a usar el _Layout como un diseño base ?

¿Hay alguna manera de hacerlo sin agregar el archivo _ViewStart (por ejemplo, a través de la configuración de enrutamiento)?

Ver también:

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


Ampliando la respuesta de Jupaol ....

Al menos en VS2013, el archivo _ViewStart.cshtml se agrega de forma predeterminada al crear el área, por lo que ya está allí, y puede cambiar los contenidos mientras señala para apuntar a la raíz _Layout.cshtml. A continuación, puede eliminar el _Layout.cshtml en el área, ya que ya no se utiliza (y una posible fuente de confusión ahora)

Sin embargo, al hacerlo, cualquier enrutamiento realizado en esa raíz _Layout.cshtml tendrá que considerar las áreas.
El _Layout.cshtml predeterminado tiene una cantidad de ayudantes de ActionLink que necesitan una ligera modificación:

Agregue el parámetro RouteValueDictionary a cualquier llamada de ActionLink configurando Area = "". Tenga en cuenta que la cadena vacía se refiere al nivel raíz. Esto permitirá que estos enlaces funcionen correctamente cuando se invocan desde dentro de un área, aún funcionan cuando se invocan desde la raíz.

p.ej:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>


Solo tienes que agregar un archivo llamado:

_ViewStart.cshtml

Debajo de cada carpeta de vistas de área:

/Areas/Area1/Views/_ViewStart.cshtml

Y edite el archivo para que apunte al diseño raíz de esta manera:

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

Para que esto funcione, no tiene que especificar un valor en la propiedad de diseño de la vista, si lo hace, estaría anulando el diseño global

Nota: Como mencionó Tony, podría editar la propiedad de diseño de cada vista para apuntar al diseño raíz, sin embargo, esta no es la manera recomendada de hacerlo, ya que combinaría sus vistas con su diseño y cambiarlo sería doloroso.

Editar 1

Si desea utilizar el código para establecer el diseño de la vista predeterminada, tal vez debería considerar escribir un motor de vista personalizado.

Intenta RazorViewEngine sobre RazorViewEngine y RazorView

Este artículo podría ser un buen punto de partida

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

No he hecho algo como esto, pero espero que te estoy apuntando en la dirección correcta


Usted especifica un diseño usando:

@ {Layout = "_Layout"; }

Si desea que sea más fácil cambiar todo de una vez. Quizás podría simplemente configurarlo como una variable de bolsa de vista y pasarlo al controlador. Para que sea aún más fácil, puede crear un controlador base del que hereden los otros controladores y hacer que asigne el diseño a la bolsa de visualización allí.

No estoy seguro de por qué el enrutamiento debería cambiar o quizás no estoy entendiendo. Espero que esto ayude :)