Frage

Ich habe ein Problem, wobei ich eine Ansicht anders (eine andere Masterseite) angezeigt werden soll, je nachdem, wo es herkommt, aber nicht wissen, wo ich anfangen soll ...

Ich habe mehrere Routen, die verschiedene Arten von URLs zu fangen, die verschiedene Strukturen enthalten.

Im Codeausschnitt unten habe ich ein Produkt Route, und dann habe ich eine Partner-Site-Route, die auch zu einer Produktseite gehen könnten, aber lassen Sie sich sagen, dass dieser Partner ist Pepsi, und sie wollen, dass ihr Branding auf der Masterseite , anstatt unsere eigenen Standard Styling. Können sagen, ich href="http://mysite.com/products/cola.htm" rel="nofollow noreferrer"> Produkte / cola.htm Partner / pepsi / products / cola.htm und die PartnerRedirect der Lage wären, die uRL zu handhaben auf dem Wildcard basiert, indem Sie die uRL Wildcard Übersetzung in eine Controller-Aktion, und leiten den Benutzer auf, (aber einfach ändern die Masterseite in der Ansicht).

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

Ist das möglich? Und wenn ja, wie?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ihre Partner-Controller, warum nicht setzen Sie ein Cookie, das die Partner Sie zeigt zeigen wollen, und leitet dann zu dem Wildcard-Abschnitt der Route. So können Sie das gleiche Partner-Layout für alle nachfolgenden Seitenansichten zeigen.

Ich weiß nicht, ob dies ist, was Sie suchen, aber es könnte eine Option sein.

Andere Tipps

Ich hatte dasselbe Problem

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

Sie dann sicher nur alle Ansichten von FriViewPage erben anstelle von Viewpage

Es kann sein, der Teufel arbeiten, aber man könnte einen Code in der Partner Ansicht der Code-Behind stellt die URL zu suchen und dann die Masterseite programmatisch dort eingestellt?

Ich bin mir nicht sicher, wie Sie programmatisch die Masterseite ändern können, wie ich nie getan habe, aber ich bin sicher, dass es möglich ist (es ist wahrscheinlich nur eine Eigenschaft auf der Seite).

Das könnte wert sein als eine andere Frage zu stellen.

Tatsächlich ist der Masterpagefile-Getter erscheint nie aufgerufen werden

Sie können die Masterpage ändern, indem Sie den Viewresult vor der Wiedergabe zu ändern. Zum Beispiel könnte eine Controller-Aktion tun:

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

Sie könnten das gleiche mit einem Action-Filter, eine generische Lösung erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top