web-dev-qa-db-ja.com

ASP.NET MVC 3かみそりViewStartファイルでさまざまなレイアウトを指定する方法を教えてください。

アプリケーションに2つの別々のレイアウトがあります。 1つはウェブサイトのパブリックセクション用で、もう1つはメンバーサイド用です。

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

  • PublicController
  • StaffController

そして、それぞれの下にあるすべてのビューに対応するレイアウトがあります。

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

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

ありがとうございます。

306
Justin

_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();
}
546
Darin Dimitrov

もう1つの方法は、ビュー内にレイアウトを定義することです。

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

もっとやるべきことは、見つけることができる ここ 、これが誰かに役立つことを願っています。

29
stom

この方法は、初心者がASP.NET MVCアプリケーションでレイアウトのレンダリングを制御する最も簡単な方法です。コントローラを識別し、レイアウトをparコントローラとしてレンダリングすることができます。これを行うには、Viewsフォルダのルートディレクトリにある_ViewStartファイルにコードを記述します。次の例は、その方法を示しています。

  @{
             var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
             string cLayout = "";
            if (controller == "Webmaster") {
                  cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
                 }
               else {
                cLayout = "~/Views/Shared/_Layout.cshtml";
               }
        Layout = cLayout;
         }

記事全文を読む こちら "ASP.NET MVCで異なるレイアウトをレンダリングする方法"

14
Anil Sharma