キャッチオールワイルドカードを使用してコントローラーにリダイレクトします(ただし、異なるマスターを使用)

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

質問

ビューがどこから来たかによってビューを異なる方法で表示したい(別のマスターページ)のに問題があるが、どこから始めればよいかわからない...

異なる構造を含むさまざまな種類のURLをキャッチするいくつかのルートがあります。

以下のコードスニペットでは、製品ルートがあり、次に製品ページにもアクセスできるパートナーサイトルートがありますが、このパートナーはペプシであり、マスターページでブランドを表示したいとします、デフォルトのスタイル設定ではなく。 products / cola.htm にアクセスするとします。これは、 partners / pepsi / products / cola.htm 、およびPartnerRedirectは、URLワイルドカード(この場合は" products / cola.htm")をコントローラーアクションに変換することで、ワイルドカードに基づいてURLを処理し、ユーザーを転送できます(ただし、ビューでマスターページを変更します)。

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

これは可能ですか?もしそうなら、どのように?

事前に感謝します。

役に立ちましたか?

解決

パートナーコントローラーで、表示するパートナーを示すCookieを設定して、ルートのワイルドカードセクションにリダイレクトします。これにより、後続のすべてのページビューで同じパートナーレイアウトを表示できます。

これがあなたが探しているものかどうかわかりませんが、オプションかもしれません。

他のヒント

同じ問題がありました

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

すべてのビューがViewPageではなくFriViewPageから継承することを確認します

悪魔の仕事かもしれませんが、パートナービューのコードビハインドにコードを配置してURLを確認し、そこにプログラムでマスターページを設定できますか?

マスターページをプログラムで変更する方法はわかりませんが、これをやったことはありませんが、それは可能だと確信しています(おそらくページの単なるプロパティです)。

別の質問として質問する価値があるかもしれません。

実際には、MasterPageFileゲッターが呼び出されることはありません

レンダリングの前にViewResultを変更することにより、MasterPageを変更できます。たとえば、コントローラアクションは次のことを実行できます。

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

より一般的なソリューションのアクションフィルターで同じことを実現できます。

scroll top