0

私は1つのビューで99%に基づく高度なサイトを作成しています。 〜/ Views/Shared/UniversalView.cshtmlという共通のビューに対応するビューを持っていないすべてのコントローラのアクションを指す責任を負う次のコードを作成しました。指定されたビューを持たないすべてのアクションを1つの具体的なビューに指し示す

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 

    foreach (IViewEngine engine in ViewEngines.Engines) 
    { 
     if (engine is RazorViewEngine) 
     { 
      RazorViewEngine razorEngine = (RazorViewEngine)engine; 
      var locationFormats = razorEngine.ViewLocationFormats; 
      List<string> l = new List<string>(locationFormats); 
      l.Add("~/Views/Shared/UniversalView.cshtml"); 
      razorEngine.ViewLocationFormats = l.ToArray(); 
     } 
    } 
} 

このような効果を得るには、もっと良い方法があることを確信しています。何か案は?

答えて

2

BaseControllerを宣言でき、すべてのコントローラがそれを継承する必要があります。

それからちょうど)あなたが(代わりに伝統的なビューのこのメソッドを呼び出すことができ、他のコントローラから

public ViewResult UniversalView(string viewName="UniversalView") 
    { 
     return View(viewName); 
    } 

ようBaseControllerのメソッドを追加します。 ビュー名を指定すると、そのビューが使用されます。デフォルトはユニバーサルビューです。

public ActionResult About() 
    { 
     return UniversalView(); 
    } 
+0

お返事ありがとうございます。以前はそのソリューションを検討していましたが、1つの違いは、コントローラクラスを継承し、Viewメソッドをオーバーライドすることを考えていたのですが、コントローラの複雑さのために怖がってしまいました。 IMHOは良い解決策ですが、プログラマはカスタムコントローラクラスから派生することを覚えておく必要があります。その結果、メンテナンスが難しくなります。 – MaciejLisCK

0

私は、関連するすべてのアクションで、そのビューを使用します。

... 
return View("UniversalView"); 

しかし、あなたは本当にあなたの道を行きたい場合。 ExecuteResultメソッドlinkを見て、それを使って必要なものを達成してください。

+0

回答ありがとうございます。ほとんどのアクションでView( "〜/ Views/Shared/UniversalView.cshtml")を返すことを覚えておく必要があるため、このソリューションは非常に難しいでしょう。 – MaciejLisCK

関連する問題