アプリケーションに 2 つの別々のレイアウトを用意したいと思います。1 つは Web サイトのパブリック セクション用、もう 1 つはメンバー側用とします。
簡単にするために、これらの各サイトのすべてのロジックが 2 つの異なるコントローラーにきちんとラップされているとします。
- パブリックコントローラ
- スタッフコントローラー
そして、それぞれの下のすべてのビューに対応するレイアウトが存在します。
- _パブリックレイアウト.cshtml
- _スタッフレイアウト.cshtml
_ViewStart.cshtml ファイルを使用して、「Public」の下のすべてのビュー/アクションで PublicLayout を使用し、「Staff」の下のすべてで StaffLayout を使用するように指定するにはどうすればよいですか?
ベストアンサー1
_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);
さらに別の可能性として、レイアウトを上書きするカスタム アクション フィルターがあります。ご覧のとおり、これを実現するにはさまざまな可能性があります。シナリオに最適なものを選択するのはあなた次第です。
アップデート:
コメント セクションでのリクエストに応じて、マスター ページを選択するアクション フィルターの例を次に示します。
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();
}