8

ベースコントローラーまたは属性のいずれかのコードを使用して、デフォルトのRazorレイアウトを設定したいと思います。これは可能であるとドキュメントで言及されていましたが、それがどのように行われるのか理解できません。

ViewメソッドのmasterPageパラメーターが使用可能であることは知っていますが、コントローラーによって返されるすべてのビューでこの値が自動的に設定されるようにしたいと思います。

いいえ、ビューはさまざまな場所に配置されるため、これに_ViewStartを使用することはできません(これは通常のMVCサイト構成ではありません)。

ありがとう

4

2 に答える 2

15

私はあなたがちょうど次のようなActionFilterを書くことができると思います...

public class YourCustomLayoutAttribute : ActionFilterAttribute, IResultFilter
{
      public override void OnResultExecuting(ResultExecutingContext filterContext)
      {
           var viewResult = filterContext.Result as ViewResult;
           if(viewResult != null)
           {
              // switch the layout
              // I assume Razor will follow convention and take the "MasterName" property and change the layout based on that.
              viewResult.MasterName = "CustomLayout";
           }
       }
}

私はこのコードをコンパイラなしでズボンの座席で書いたので、おそらくコンパイルされませんが、おそらくあなたはその考えを理解するでしょう。IResultFilterはあなたが望む正しいインターフェースだと思います。それは、ビューがレンダリングされる直前に実行されるメソッドを持っています。これが正しければ、オンザフライでレンダリングされようとしているビューのMasterNameを変更できるはずです。

これは、コントローラーコードの使用法になります。

[YourCustomLayout] // this should trigger your custom action result for all actions
public class MyController : Controller
{
   public ActionResult Index()
   {
      return View("Index", "MainLayout"); // even if you were to use the overload to set a master, the action result should override it as it executes later in the pipeline.
   }
}
于 2010-10-30T05:45:37.727 に答える
3

これを行うために私が考えることができる最も簡単な方法は、Viewメソッドをオーバーライドするカスタム基本クラスからコントローラーを派生させることです。

public class MyControllerBase : Controller {
    public override ViewResult View(string viewName, string masterName, object model) {
        if(String.IsNullOrEmpty(masterName)) {
            masterName = GetDefaultLayout();
        }
        base.View(viewName, masterName, model);
    }

    public virtual string GetDefaultLayout() {
        return // your default layout here
    }
}

上記のコードでは、masterNameをハードコードされた値に明示的に設定できます。または、コントローラーがメソッドをオーバーライドして、コントローラー固有のレイアウトを提供することもできます。または、コントローラーの属性から読み取ることもできます。これは、次のようなものです。

masterName = GetType().GetCustomAttributes().
             OfType<MyCustomAttribute>().FirstOrDefault().DefaultLayoutPage;

もちろん、を作成する必要がありますMyCustomAttribute

于 2010-10-29T01:34:45.417 に答える