Pregunta

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

Tengo varias rutas que capturan varios tipos diferentes de urls que contienen estructuras diferentes.

En el fragmento de código a continuación, tengo una ruta de producto, y luego tengo una ruta de sitio de socio que también podría ir a una página de producto, pero digamos que este socio es Pepsi y quieren su marca en la página maestra. , en lugar de nuestro propio estilo por defecto. Digamos que voy a products / 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, mediante la traducción del comodín url (en este caso, " products / cola.htm ") en una acción de controlador, y reenviar al usuario, (pero simplemente cambiar 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 esto posible? Y si es así, ¿cómo?

Muchas gracias de antemano.

¿Fue útil?

Solución

En el controlador de su socio, ¿por qué no configura una cookie que indique qué socio desea mostrar y luego redirige a la sección de caracteres comodín de la ruta? De esa manera, 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.

Otros consejos

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

Luego, solo asegúrate de que todas las vistas se hereden de FriViewPage en lugar de ViewPage

Puede ser que los demonios funcionen, pero podría poner algo de código en el código de la Vista de pareja para ver la URL y luego configurar la página maestra programáticamente allí.

No estoy seguro de cómo puedes alterar programáticamente la página maestra, ya que nunca lo he hecho, pero estoy seguro de que es posible (probablemente solo sea una propiedad en la página).

Eso podría valer la pena preguntar como otra pregunta.

En realidad, el getter de MasterPageFile nunca parece ser llamado

Puedes cambiar la MasterPage 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top