Domanda

Ho un problema per cui voglio visualizzare una vista in modo diverso (una pagina master diversa), a seconda di dove proviene, ma non so da dove iniziare ...

Ho diversi percorsi che catturano vari tipi di URL che contengono strutture diverse.

Nello snippet di codice riportato di seguito, ho una route di prodotto, quindi ho una route del sito del partner che potrebbe anche andare a una pagina del prodotto, ma diciamo che questo partner è Pepsi e vogliono il loro marchio sulla pagina principale , piuttosto che il nostro stile predefinito. Diciamo che vado a products / cola.htm . Questo dovrebbe andare allo stesso URL di partners / pepsi / products / cola.htm e PartnerRedirect sarebbe in grado di gestire l'URL in base al carattere jolly, traducendo il carattere jolly url (in questo caso, " products / cola.htm ") in un'azione del controller e inoltrando l'utente su (ma semplicemente cambia la pagina principale nella 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" }
);

È possibile? E se sì, come?

Molte grazie in anticipo.

È stato utile?

Soluzione

Nel controller dei tuoi partner perché non imposti un cookie che indichi quale partner desideri mostrare, quindi reindirizza alla sezione con caratteri jolly del percorso. In questo modo puoi mostrare lo stesso layout di partner per tutte le successive visualizzazioni di pagina.

Non so se questo è quello che stai cercando, ma potrebbe essere un'opzione.

Altri suggerimenti

Ho avuto lo stesso 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";
        }
    }
}

Quindi assicurati solo che tutte le viste ereditino da FriViewPage invece di ViewPage

Potrebbe essere il lavoro dei diavoli, ma potresti inserire un po 'di codice nel codice della Vista partner dietro per guardare l'URL e quindi impostare la pagina principale in modo programmatico lì dentro?

Non sono sicuro di come sia possibile modificare a livello di programmazione la pagina principale, poiché non l'ho mai fatto, ma sono sicuro che sia possibile (probabilmente è solo una proprietà nella pagina).

Potrebbe valere la pena di fare un'altra domanda.

In realtà il getter MasterPageFile non sembra mai essere chiamato

È possibile cambiare MasterPage modificando ViewResult prima del rendering. Ad esempio, un'azione del controller potrebbe eseguire:

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

Potresti realizzare la stessa cosa con un filtro di azione per una soluzione più generica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top