2013-10-06 5 views
6

私はMVCが新しく、どのように私がビューを変更することができるかについて非常に興味があると知りました&部分的な場所の場所。変更方法ビュー&パーシャルビューのデフォルトの場所

ビュー&ビューフォルダ内に部分ビューストアがあります。私のコントローラ名がホームであれば、ビューはビューフォルダ内のホームフォルダと共有フォルダ内のすべてのパリアルビューストアにストアする必要があります。私はどのように私は変更することができますかを知っているように表示&部分的なビューのデフォルトの場所を表示しますか?

1)私のコントローラ名は製品だとしますが、myproductフォルダに対応するビューを保存したいと考えています。私はすべてをうまく動かすために何をする必要があるのか​​を教えてください。

2)私はすべての部分ビューをビューフォルダ内の部分フォルダに保存し、そこからすべての部分ビューをロードしたいと思います。すべてをうまく動かすために必要なことを私に案内してくれます。

basicallどのようにコントローラに指示することができます&私のフォルダからの部分的なビューをパスを言及せずにロードする。良い議論を探しています。ありがとう

+0

あなた自身のビューエンジンを作成するように言われた人もいますが、カスタムビューエンジンを作成しなくてもこれは可能です。知識で助けてください。ありがとう – Mou

+0

http://coding-in.net/mvc-3-organize-your-partial-views/ – Mou

答えて

9

RazorViewEngineViewLocationFormatsPartialViewLocationFormatsのプロパティは、Global.asaxスタートアップコードで変更できます。下のラインの周りに何か動作するはずです:

protected void Application_Start(object obj, EventArgs e) 
{ 
    var engine = ViewEngines.Engines.OfType<RazorViewEngine>().Single(); 
    var newViewLocations = new string[] { 
     "~/SomeOtherFolder/{1}/{0}.cshtml", 
     "~/GlobalFolder/{0}.cshtml"  
    }; 
    engine.ViewLocationFormats = newViewLocations; 
    engine.PartialViewLocationFormats = newViewLocations; 
} 

IIRCは、{1}コントローラと{0}の名前を表示するために、あなたが確認するために、既存のプロパティを見ることができますし対応することになります。

既存の検索場所を保持する場合は、新しい配列にコピーする必要があります。

public class MyRazorViewEngine : RazorViewEngine 
{ 
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     if (controllerContext.Controller is ProductController) 
     { 
      string viewPath = "/Views/MyProduct/" + viewName + ".cshtml"; 
      return base.FindView(controllerContext, viewPath, masterName, useCache); 
     } 

     return base.FindView(controllerContext, viewName, masterName, useCache); 
    } 

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) 
    { 
     if (controllerContext.Controller is ProductController) 
     { 
      string partialViewPath = "/Views/MyProduct/Partials/" + partialViewName + ".cshtml"; 
      return base.FindPartialView(controllerContext, partialViewPath, useCache); 
     } 

     return base.FindPartialView(controllerContext, partialViewName, useCache); 
    } 
} 

そして:あなたは、特定のコントローラーのための特別な景色の場所を持っているしたい場合は

+0

誰もコントローラのデフォルトの場所を変更する方法を指摘できますか?可能であれば、asp.net mvcコントローラのデフォルトの場所を変更するための正しい記事にリダイレクトしてください。ありがとうございました – Mou

+0

@新しい質問としてお気軽に@。 –

9

は、あなたのケースでは、あなたがProductControllerビューはMYPRODUCTフォルダに行きたい、あなたはRazorViewEngineFindViewFindPartialViewメソッドをオーバーライドする必要がありますあなたは多分、「マイ」のすべてのコントローラビューのフォルダにを付加したい場合は、あなたのビュー・エンジンは、この

public class MyRazorViewEngine : RazorViewEngine 
{ 
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     string viewPath = "/Views/My" + GetControllerName(controllerContext) + "/" + viewName + ".cshtml"; 
     return base.FindView(controllerContext, viewPath, masterName, useCache); 
    } 

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) 
    { 
     string partialViewPath = "/Views/My" + GetControllerName(controllerContext) + "/Partials/" + partialViewName + ".cshtml"; 
     return base.FindPartialView(controllerContext, partialViewPath, useCache); 
    } 

    private string GetControllerName(ControllerContext controllerContext) 
    { 
     return controllerContext.RouteData.Values["controller"].ToString(); 
    } 
} 

そして、あなたのGlobal.asaxの

よりも、のようになります。
protected void Application_Start() 
{ 
    //remove unused view engines, for performance reasons as well 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new MyRazorViewEngine()); 
} 
+0

誰でもコントローラのデフォルトの場所を変更する方法を指摘できますか?可能であれば、asp.net mvcコントローラのデフォルトの場所を変更するための正しい記事にリダイレクトしてください。ありがとう – Mou

+0

@あなたはコントローラのデフォルトの場所を変更することによってどういう意味ですか?それらは通常Controllersフォルダにありますが、自由に移動することができます。 –

関連する問題