1. ホーム
  2. asp.net-mvc

[解決済み】ASP.NET MVC 3 razor ViewStart ファイルで異なるレイアウトを指定するには?

2022-03-27 06:19:41

質問

アプリケーションで2つのレイアウトを使い分けたいのですが、どうすればいいですか?例えば、1つはウェブサイトのパブリックセクション用、もう1つはメンバーサイド用とします。

簡単のために、これらのサイトのすべてのロジックは、2つの異なるコントローラにきちんとラップされているとしましょう。

  • PublicController
  • StaffController

そして、それぞれの下にあるすべてのViewに対応するLayoutをそれぞれ持っていること。

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

_ViewStart.cshtml ファイルを使用して、"Public" 以下のすべてのView / ActionがPublicLayoutを使用し、"Staff" 以下のすべてがStaffLayoutを使用すると指定するには、どのようにしたらよいでしょうか。

解決方法は?

を配置することができます。 _ViewStart.cshtml ファイルの中に /Views/Public フォルダーにあるデフォルトのものを上書きします。 /Views フォルダを作成し、希望のレイアウトを指定します。

@{
    Layout = "~/Views/Shared/_PublicLayout.cshtml";
}

類似の方法として、別の _ViewStart.cshtml ファイルの中に /Views/Staff というフォルダを作成します。

@{
    Layout = "~/Views/Shared/_StaffLayout.cshtml";
}

また、コントローラアクションの中でビューを返すときにどのレイアウトを使用するかを指定することもできますが、これはアクションごとに行います。

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

さらに別の可能性としては、レイアウトを上書きするカスタムアクションフィルタがあります。このように、多くの可能性があることがお分かりいただけると思います。あなたのシナリオに最も適したものを選択するのはあなた次第です。


UPDATE

コメント欄でリクエストのあった、マスターページを選択するアクションフィルターの例です。

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

を作成し、コントローラやアクションをこのカスタム属性で装飾し、必要なレイアウトを指定します。

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}