質問

  

重要な更新
  MVC 2.0 Preview 1のリリース以来、この機能は実際のフレームワーク自体の一部としてAreasの形式で実装されています。 Phil Haackのブログこちらで詳細を確認できます。

ListManagerControllerというコントローラーがあります。このコントローラーには、Index()というActionResultメソッドが含まれています。 Visual Studioでインデックスを右クリックして[ビューの追加]を選択すると、新しいビューが/ Views / ListManager / Indexに作成されます。

ただし、/ Views / Manage / ListManager /にIndexビューと後続のすべてのビューを作成する必要があります。これをどのように達成しますか?

編集:この質問は、こちら。私の検索スキルが最初に私に失敗したようです。

役に立ちましたか?

解決

ビューの場所は、使用しているViewFactoryに関連付けられています。私の知る限り、Webフォームビューエンジンはエリアをサポートしていません[例で管理]。

Spark はこれをサポートしており、非常にクリーンです。また、Webフォームとスパークビューを組み合わせて一致させることができます。すべてのビューを再作成する必要はありません。

更新: Phil Haackにはブログ投稿をご覧ください。彼のコードはRC用ですが、ASP.NET MVC RTMに対してうまくコンパイルできると思います。

他のヒント

あなたはすでに答えを受け入れていることは知っていますが、 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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top