Redireccionamento para o controlador (mas com um mestre diferente) utilizando um carácter universal genérico

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

Pergunta

Eu tenho um problema pelo qual eu quero mostrar uma visão diferente (uma página mestra diferente), dependendo de onde ele veio, mas não sei por onde começar ...

Eu tenho várias rotas que capturam vários tipos diferentes de URLs que contenham diferentes estruturas.

No trecho de código abaixo, eu tenho uma rota de produto, e então eu tenho uma rota site parceiro que também poderia ir para a página do produto, mas vamos dizer que este parceiro é a Pepsi, e eles querem a sua marca na página mestre , ao invés de nosso próprio estilo padrão. Vamos dizer que eu ir para a produtos / cola.htm . Isto deve ir para o mesmo URL como parceiros / Pepsi / produtos / cola.htm , eo PartnerRedirect seria capaz de lidar com a url baseada na curinga, traduzindo o curinga url (neste caso, "produtos / cola.htm") em uma ação do controlador e encaminhar o usuário sobre, (mas simplesmente mudança a página mestra na visualização).

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

Isso é possível? E se sim, como?

Muito obrigado antecipadamente.

Foi útil?

Solução

Em seu controlador parceiros por que você não definir um cookie que indica qual o parceiro que você quer mostrar, em seguida, redireciona para a seção curinga da rota. Dessa forma, você pode mostrar o mesmo layout parceiro para todas as exibições de página seguinte.

Eu não sei se é isso que você está procurando, mas pode ser uma opção.

Outras dicas

Eu tive mesmo 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";
        }
    }
}

Em seguida, basta garantir que todos os pontos de vista herdam FriViewPage vez de ViewPage

Pode ser o trabalho dos diabos, mas você pode colocar algum código em codebehind da Partner View para olhar para o URL e, em seguida, definir a página mestre programaticamente lá dentro?

Eu não sei como você pode programaticamente alterar a página mestra, como eu nunca fiz isso, mas eu tenho certeza que é possível (é provavelmente apenas uma propriedade na página).

Isso pode valer a pena perguntar como outra questão.

Na verdade, o getter MasterPageFile nunca aparece para ser chamado

Você pode alterar a MasterPage modificando o ViewResult antes da renderização. Por exemplo, uma ação de controlador poderia fazer:

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

Você poderia fazer a mesma coisa com um filtro de ação para uma solução mais genérica.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top