web-dev-qa-db-ja.com

ASP.Net MVCの「View / Shared」フォルダーにサブディレクトリを追加し、ビューを呼び出す

現在、RazorでASP.Net MVC3を使用してサイトを開発しています。 「View/Shared」フォルダ内に、「Partials」というサブフォルダを追加して、すべての部分ビューを配置できるようにします(サイトを整理するためです。

ビューを呼び出すときに(Razorを使用して) "Partials"フォルダーを常に参照している限り、問題なくこれを実行できます。

@Html.Partial("Partials/{ViewName}")

私の質問は、ビューを検索するときに.Netが通過するリストに「Partials」フォルダーを追加する方法があるかどうかです。このように、「Partials」フォルダーを参照せずにビューを呼び出すことができます。

@Html.Partial("{ViewName}")

助けてくれてありがとう!

48
lamarant

これを解決しました。 Razorで部分ビューを見つけようとしたときに検索した場所のリストに作成した「Shared/Partials」サブディレクトリを追加するには:

@Html.Partial("{NameOfView}")

まず、RazorViewEngineを基本クラスとしてビューエンジンを作成し、次のようにビューの場所を追加します。繰り返しますが、MVCによって作成されたデフォルトの「Views/Shared」ディレクトリ内に作成した「Partials」サブディレクトリにすべての部分ビューを保存したかったのです。

public class RDDBViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats = 
    { 
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    };

    public RDDBViewEngine()
    {
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
    }       

}

ロケーション形式の{1}はコントローラー名であり、{0}はビューの名前であることに注意してください。

次に、global.asaxのApplication_Start()メソッドで、そのビューエンジンをMVC ViewEngines.Enginesコレクションに追加します。

ViewEngines.Engines.Add(new RDDBViewEngine()); 
65
lamarant

ご回答ありがとうございます。これで共有フォルダーが整理されましたが、なぜ新しいタイプのビューエンジンを作成するのですか?新しいRazorViewEngineを作成し、PartialViewLocationFormatsに設定して、ViewEnginesのリストに追加しました。

ViewEngines.Engines.Add(new RazorViewEngine
{
    PartialViewLocationFormats = new string[]
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    }
});
28
David Cabiness

ビューエンジンをカスタマイズするのは良いことですが、サブフォルダのパーシャルを必要とするだけならそれほど必要ありません...

レイアウトビューの場合と同様に、部分ビューへのフルパスを使用します。

@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")

それが誰かを助けることを願っています...

16
repeatdomiau

ラマラントの優れた答えを更新して、エリアを含めました。

public class RDDBViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats =
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    };

    private static List<string> AreaRegistrations;

    public RDDBViewEngine()
    {
        AreaRegistrations = new List<string>();

        BuildAreaRegistrations();

        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(areaRegistrations).ToArray();
    }

    private static void BuildAreaRegistrations()
    {
        string[] areaNames = RouteTable.Routes.OfType<Route>()
            .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area"))
            .Select(r => r.DataTokens["area"].ToString()).ToArray();

        foreach (string areaName in areaNames)
        {
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Partials/{0}.cshtml");
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Partials/{0}.cshtml");
        }
    }
}

その後、アプリケーションの開始に含めることを忘れないでください:

public class MvcApplication : System.Web.HttpApplication
{

    protected void Application_Start()
    {
        ...

        ViewEngines.Engines.Add(new RDDBViewEngine()); 
    }
}
6
mcfea

登録済みのRazorViewEngineのpartialview-location-formatsを更新することもできます。 Global.asaxのApplication_Startに以下のコードを配置します。

 RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault();
        if (razorEngine != null)
        {
            string[] newPartialViewFormats = new[] { 
                    "~/Views/{1}/Partials/{0}.cshtml",
                    "~/Views/Shared/Partials/{0}.cshtml"
            };
            razorEngine.PartialViewLocationFormats =
                razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray();
        }
5
SridharVenkat

使用しているビューエンジン(Webforms/Razor)から派生する独自のビューエンジンを登録し、コンストラクターで任意の場所を指定するか、既存の場所のリストに追加することができます。

_this.PartialViewLocationFormats = viewLocations;
_

次に、アプリケーションの起動時に、ビューエンジンを次のように追加します:ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());

1
Joe Cartano