現在、RazorでASP.Net MVC3を使用してサイトを開発しています。 「View/Shared」フォルダ内に、「Partials」というサブフォルダを追加して、すべての部分ビューを配置できるようにします(サイトを整理するためです。
ビューを呼び出すときに(Razorを使用して) "Partials"フォルダーを常に参照している限り、問題なくこれを実行できます。
@Html.Partial("Partials/{ViewName}")
私の質問は、ビューを検索するときに.Netが通過するリストに「Partials」フォルダーを追加する方法があるかどうかです。このように、「Partials」フォルダーを参照せずにビューを呼び出すことができます。
@Html.Partial("{ViewName}")
助けてくれてありがとう!
これを解決しました。 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());
ご回答ありがとうございます。これで共有フォルダーが整理されましたが、なぜ新しいタイプのビューエンジンを作成するのですか?新しいRazorViewEngine
を作成し、PartialViewLocationFormats
に設定して、ViewEngines
のリストに追加しました。
ViewEngines.Engines.Add(new RazorViewEngine
{
PartialViewLocationFormats = new string[]
{
"~/Views/{1}/Partials/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
}
});
ビューエンジンをカスタマイズするのは良いことですが、サブフォルダのパーシャルを必要とするだけならそれほど必要ありません...
レイアウトビューの場合と同様に、部分ビューへのフルパスを使用します。
@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")
それが誰かを助けることを願っています...
ラマラントの優れた答えを更新して、エリアを含めました。
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());
}
}
登録済みの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();
}
使用しているビューエンジン(Webforms/Razor)から派生する独自のビューエンジンを登録し、コンストラクターで任意の場所を指定するか、既存の場所のリストに追加することができます。
_this.PartialViewLocationFormats = viewLocations;
_
次に、アプリケーションの起動時に、ビューエンジンを次のように追加します:ViewEngines.Engines.Add(new MyViewEngineWithPartialPath());