MvcコントローラのMvcビューが作成される場所を指定する方法は?
-
03-07-2019 - |
質問
重要な更新
MVC 2.0 Preview 1のリリース以来、この機能は実際のフレームワーク自体の一部としてAreasの形式で実装されています。 Phil Haackのブログこちらで詳細を確認できます。
ListManagerControllerというコントローラーがあります。このコントローラーには、Index()というActionResultメソッドが含まれています。 Visual Studioでインデックスを右クリックして[ビューの追加]を選択すると、新しいビューが/ Views / ListManager / Indexに作成されます。
ただし、/ Views / Manage / ListManager /にIndexビューと後続のすべてのビューを作成する必要があります。これをどのように達成しますか?
編集:この質問は、こちら。私の検索スキルが最初に私に失敗したようです。
他のヒント
あなたはすでに答えを受け入れていることは知っていますが、 Phil Haackの投稿。
最初に、Viewフォルダーの下にあるフォルダーを検索するには、独自のViewEngineが必要です。このようなもの:(Phil Haackの市外局番によく似ていることに気付くでしょう)
public class TestViewEngine : WebFormViewEngine
{
public TestViewEngine()
: base()
{
MasterLocationFormats = new[] {
"~/Views/{1}/{0}.master",
"~/Views/Shared/{0}.master"
};
ViewLocationFormats = new[] {
"~/{0}.aspx",
"~/{0}.ascx",
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};
PartialViewLocationFormats = ViewLocationFormats;
}
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
ViewEngineResult rootResult = null;
//if the route data has a root value defined when mapping routes in global.asax
if (controllerContext.RouteData.Values.ContainsKey("root")) {
//then try to find the view in the folder name defined in that route
string rootViewName = FormatViewName(controllerContext, viewName);
rootResult = base.FindView(controllerContext, rootViewName, masterName, useCache);
if (rootResult != null && rootResult.View != null) {
return rootResult;
}
//same if it's a shared view
string sharedRootViewName = FormatSharedViewName(controllerContext, viewName);
rootResult = base.FindView(controllerContext, sharedRootViewName, masterName, useCache);
if (rootResult != null && rootResult.View != null) {
return rootResult;
}
}
//if not let the base handle it
return base.FindView(controllerContext, viewName, masterName, useCache);
}
private static string FormatViewName(ControllerContext controllerContext, string viewName) {
string controllerName = controllerContext.RouteData.GetRequiredString("controller");
string root = controllerContext.RouteData.Values["root"].ToString();
return "Views/" + root + "/" + controllerName + "/" + viewName;
}
private static string FormatSharedViewName(ControllerContext controllerContext, string viewName) {
string root = controllerContext.RouteData.Values["root"].ToString();
return "Views/" + root + "/Shared/" + viewName;
}
}
Global.asax
の Application_Start
で、デフォルトのViewEngineをカスタムのViewEngineに置き換えます:
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestViewEngine());
Global.asax
でルートを定義する場合、Viewフォルダーの下で検索するフォルダーを示す root
値を設定する必要があります。
routes.MapRoute(
"ListManager",
"ListManager/{action}/{id}",
new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
);
この質問は、この質問
そのため、ここでの回答を引用します。
別の解決策を思いついた 自分で転がす必要はなかった ビューエンジン。
基本的に、MVCを "コンベンション"可能な限り駆動されますが、私は まだ私のすべてを整理したかった "管理者" 〜/ Views / Adminの下のビュー フォルダ。
例:
- 〜/ Views / Admin / User /
- 〜/ Views / Admin / News /
- 〜/ Views / Admin / Blog /
私の解決策は、新しいベースを作成することでした 特定の管理者向けのクラス コントローラーと「力」への道 そのコントローラーのビュー。
ブログの投稿とサンプルコードがあります ここ: ASP.Netでビューを整理する MVC