2016-05-24 6 views
3

以前のバージョンのMVCでは、View() methodを使用してコントローラのレイアウトを設定できました。コントローラのレイアウトを設定する

public class MyController 
{ 
    public ActionResult Test1() 
    { 
    return View("Test", "Layout1"); 
    } 
    public ActionResult Test2() 
    { 
    return View("Test", "Layout2"); 
    } 
} 

しかし、documentationにパラメータとしてレイアウト/テンプレート/マスターページを取るViewの過負荷が存在しないことが表示されます。すべての私のモデルまたはビューにロジックを追加する

は本当にこのロジックのひどいオプションなので、コントローラのメソッド内の代替はありますか?

Asp.Net MVC 6 /コアController Source Code

+0

奇妙なは、私のために正常に動作します。 –

+0

[tag:asp.net-core-mvc]別名MVC 6を使用していますか? –

答えて

1

それは汚い感じていないが、私がやった:

魔法の文字列(理論):

public enum ViewDataType 
{ 
    Layout = 0 
} 

ViewDataを拡張

public static class ViewDataExtensions 
{ 
    public static void Add(this ViewDataDictionary viewData, ViewDataType viewDataType, object value) 
    { 
     viewData.Add(viewDataType.ToString(), value); 
    } 

    public static TResult Get<TResult>(this ViewDataDictionary viewData, ViewDataType viewDataType) 
     where TResult : class 
    { 
     var result = viewData[viewData.ToString()] as TResult; 

     return result; 
    } 
} 

コントローラーの拡張:

public static class ControllerExtensions 
{ 
    public static IActionResult View(this Controller instance, object model, string layout) 
    { 
     instance.ViewData.Add(ViewDataType.Layout, layout); 
     return instance.View(model); 
    } 

    public static IActionResult View(this Controller instance, string viewName, object model, string layout) 
    { 
     instance.ViewData.Add(ViewDataType.Layout, layout); 
     return instance.View(viewName, model); 
    } 
} 

アメリカGE:

public IActionResult Index() 
{ 
    // blah blah logic 

    var result = this.View("ViewName", model, "Layouts/Default"); 
} 

とViewStartで:

var layout = this.ViewData.Get<string>(ViewDataType.Layout) 
if (string.IsNullOrEmpty(layout)) 
{ 
    Layout = "Layouts/Default"; 
} 
else 
{ 
    Layout = layout; 
} 
関連する問題