Redirection vers le contrôleur (mais avec un maître différent) à l'aide d'un caractère générique catchall

StackOverflow https://stackoverflow.com/questions/237440

Question

J'ai un problème avec lequel je veux afficher une vue différemment (une page maître différente), en fonction de son origine, mais je ne sais pas par où commencer ...

J'ai plusieurs itinéraires qui capturent différents types d'URL contenant différentes structures.

Dans l'extrait de code ci-dessous, j'ai un itinéraire de produit, puis un itinéraire de site partenaire qui peut également accéder à une page de produit, mais disons que ce partenaire est Pepsi et qu'ils veulent que leur image de marque apparaisse sur la page maître. , plutôt que notre propre style par défaut. Disons que je vais à products / cola.htm . Cela devrait aller à la même URL que partners / pepsi / products / cola.htm , et PartnerRedirect serait capable de gérer l'URL basée sur le caractère générique, en traduisant le caractère générique d'URL (dans ce cas, "products / cola.htm") en une action du contrôleur, puis en transférant l'utilisateur sur (mais simplement changer la page maître dans la vue).

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

Est-ce possible? Et si oui, comment?

Merci d'avance.

Était-ce utile?

La solution

Dans le contrôleur de votre partenaire, pourquoi ne pas définir un cookie indiquant le partenaire à afficher, puis le rediriger vers la section relative au caractère générique de la route. De cette façon, vous pouvez afficher la même présentation de partenaire pour toutes les vues de page suivantes.

Je ne sais pas si c'est ce que vous recherchez, mais cela pourrait être une option.

Autres conseils

J'ai eu le même problème

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

Ensuite, assurez-vous que toutes les vues héritent de FriViewPage au lieu de ViewPage

C’est peut-être le travail du diable mais vous pouvez insérer du code dans la base de code de la vue Partenaire pour consulter l’URL, puis définir la page maître par programme?

Je ne sais pas comment vous pouvez modifier par programmation la page maître, car je ne l'ai jamais fait, mais je suis sûr que c'est possible (c'est probablement juste une propriété sur Page).

Cela pourrait valoir la peine de poser une autre question.

En réalité, le getter MasterPageFile ne semble jamais s'appeler

Vous pouvez modifier la MasterPage en modifiant ViewResult avant le rendu. Par exemple, une action du contrôleur peut faire:

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

Vous pouvez réaliser la même chose avec un filtre d'action pour une solution plus générique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top