6

私はMVCが初めてで、ビューと部分ビューの場所を変更する方法を知りたいと思っています。

ビューフォルダーにビューと部分ビューが保存されていることがわかっています。コントローラー名がホームの場合、ビューはビューフォルダー内のホームフォルダーに保存し、すべての部分ビューを共有フォルダーに保存する必要があります。ビューと部分ビューのデフォルトの場所を変更する方法を教えてください。

1)コントローラー名が製品であると仮定しますが、対応するビューを製品フォルダーに保存したいと思います........すべてが正常に機能するために必要なことを教えてください。

2) すべての部分ビューをビュー フォルダー内の部分フォルダーに保存し、そこからすべての部分ビューを読み込みたい。すべてがうまく機能するために何をする必要があるかを教えてください。

基本的に、パスに言及せずに、コントローラーにフォルダーからビューと部分ビューをロードするように指示するにはどうすればよいですか。良い議論を探しています。ありがとう

4

2 に答える 2

10

特定のコントローラーに特別なビューの場所が必要な場合は、ProductController ビューを MyProduct フォルダーに移動する必要があります。次のメソッドをオーバーライドする必要がFindViewありFindPartialViewますRazorViewEngine

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);
    }
}

また、すべてのコントローラー ビュー フォルダーの先頭に「My」を追加したい場合、ビュー エンジンは次のようになります。

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());
}
于 2013-10-06T20:30:31.513 に答える
9

Global.asax スタートアップ コードでとプロパティを変更できRazorViewEngineます。以下の行の周りの何かが機能するはずです:ViewLocationFormatsPartialViewLocationFormats

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} はビュー名に対応します。既存のプロパティを確認して確認できます。

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

于 2013-10-06T19:35:10.417 に答える