キャッチオールワイルドカードを使用してコントローラーにリダイレクトします(ただし、異なるマスターを使用)
-
04-07-2019 - |
質問
ビューがどこから来たかによってビューを異なる方法で表示したい(別のマスターページ)のに問題があるが、どこから始めればよいかわからない...
異なる構造を含むさまざまな種類の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;
}
より一般的なソリューションのアクションフィルターで同じことを実現できます。