page net mvc5 mvc error customerrors custom asp asp.net-mvc redirect routing master-pages

asp.net-mvc - net - customerrors mvc5



Redirigir al controlador(pero con un maestro diferente) usando un comodín catchall (6)

Tengo un problema por el cual quiero mostrar una vista de manera diferente (una página maestra diferente), dependiendo de dónde proviene, pero no sé por dónde empezar ...

Tengo varias rutas que atrapan diferentes tipos de URL que contienen diferentes estructuras.

En el siguiente fragmento de código, tengo una ruta de producto, y luego tengo una ruta de sitio asociada que también podría ir a una página de producto, pero digamos que este es Pepsi, y quieren su marca en la página maestra, en lugar de nuestro propio estilo predeterminado. Digamos que voy a productos / cola.htm . Esto debería ir a la misma URL que partners / pepsi / products / cola.htm , y PartnerRedirect podría manejar la url basada en el comodín, traduciendo el comodín url (en este caso, "products / cola.htm"). ) en una acción de controlador, y reenviar al usuario, (pero simplemente cambie la página maestra en la vista).

routes.MapRoute( "Product", "products/{product}.htm", new { controller = "Product", action = "ShowProduct" } ); routes.MapRoute( "ProductReview", "products/{product}/reviews.htm", new { controller = "Product", action = "ShowProductReview" } ); routes.MapRoute( "Partner", "partners/{partner}/{*wildcard}", new { controller = "Partners", action = "PartnerRedirect" } );

es posible? Y si es así, ¿cómo?

Muchas gracias de antemano.


Acutally el get de MasterPageFile nunca parece ser llamado


Tuve el mismo problema

public class FriViewPage : ViewPage { public override string MasterPageFile { get { return "~/Views/Shared/Site.Master"; // base.MasterPageFile; } set { if (ViewData["agent"].ToString() == "steve") base.MasterPageFile = "~/Views/Shared/Site.Master"; else base.MasterPageFile = "~/Views/Shared/Site2.Master"; } } }

A continuación, asegúrese de que todas las vistas hereden de FriViewPage en lugar de ViewPage


En el controlador de su pareja, ¿por qué no configura una cookie que indica qué socio desea mostrar y luego lo redirecciona a la sección de comodín de la ruta? De esta forma, puede mostrar el mismo diseño de socio para todas las vistas de página subsiguientes.

No sé si esto es lo que estás buscando, pero podría ser una opción.


No estoy seguro de cómo puede modificar programáticamente la página maestra, ya que nunca he hecho eso, pero estoy seguro de que es posible (es probable que sea solo una propiedad en la página).

Eso podría valer la pena como otra pregunta.


Puede ser que los demonios funcionen, pero podría poner algún código en el código de la Vista de socio para ver la URL y luego establecer la página maestra programáticamente allí?


Puede cambiar la página maestra modificando ViewResult antes de renderizar. Por ejemplo, una acción del controlador podría hacer:

public ActionResult TestMP(int? id) { ViewData["Title"] = "MasterPage Test Page"; ViewData["Message"] = "Welcome to ASP.NET MVC!"; ViewResult result = View("Index"); if (id.HasValue) { result.MasterName = "Site2"; } return result; }

Podría lograr lo mismo con un filtro de acción para una solución más genérica.