4

asp.net MVC 3では、コントローラーまたはアクションフィルターからビューに設定されたレイアウト宣言をオーバーライドする方法はありますか?

@{
    レイアウト = "~/Views/Shared/_Layout.cshtml";
}

次のコード スニペットのように、OnResultExecuted または OnResultExecuting で MasterName プロパティをオーバーライドしようとしましたが、役に立ちませんでした。

public override void OnResultExecuting(ResultExecutingContext filterContext)
{
    var view = filterContext.Result as ViewResult;
    view.MasterName = null;
}
4

4 に答える 4

3

レイアウトを制御できるもう 1 つの場所は、_ViewStart.cshtmlです。

ここでは、必要なロジックを実行し、使用するレイアウトをプログラムで指定できます。これにより、ロジックを 1 か所だけに配置して、ビューから除外することができます。

@{
    if(myBusinessRule)
    {
       Layout = "~/Views/Shared/_Layout.cshtml";
    }
    else
    {
       Layout = "~/Views/Shared/_SecondaryLayout.cshtml";
    }
}

Scott Gu によって紹介されたブログ投稿

于 2013-07-29T19:32:52.067 に答える
3

アクション フィルターを作成してレイアウト ファイルをオーバーライドできますが、それを削除する場合は、Master プロパティを null に割り当てるのではなく、空のレイアウト ファイルを作成する必要があります。このような:

public class OverrideLayoutFilter : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var view = filterContext.Result as ViewResult;
        view.MasterName = "_LayoutEmpty";
        base.OnResultExecuting(filterContext);
    }
}

コントローラ:

public class HomeController : Controller
{
    [OverrideLayoutFilter]
    public ActionResult Index()
    {
        return View();
    }
}

ここで、新しいレイアウト ファイルを SharedFolder に配置する必要があり、RenderBody 関数のみを内部に配置します。

_LayoutEmpty.cshtml

@RenderBody()

注: レイアウトをオーバーライドしたいセクションがビューに定義されている場合は、それらのセクションも空のコンテンツで定義する必要があります。

于 2013-07-29T19:45:20.833 に答える
2

レイアウトを変更する必要がある場合は、ViewBag を使用してアクションを呼び出し、新しいレイアウト (null の場合もある) をビューバッグに入れます。

@{
   Layout = ViewBag.layout;
}

そしてアクションの中で

if(something)
   ViewBag.layout = "~/Views/Shared/whatever.cshtml";
else
   ViewBag.layout = null;
于 2013-07-29T18:56:19.563 に答える
1

このテーマに関する私の以前の投稿の 1 つに参照を追加するだけで申し訳ありませんが、ここを見てください。

_ViewStart.cshtml レイアウト ファイルはどこにどのようにリンクされていますか?

于 2013-07-29T20:08:06.623 に答える