0

重要な更新
MVC2.0Preview 1のリリース以降、この機能は実際のフレームワーク自体の一部としてAreasの形式で実装されています。詳細については、PhilHaackのブログをご覧ください。

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

ただし、インデックスビューとそれに続くすべてのビューを/ Views / Manage /ListManager/に作成する必要があります。どうすればこれを達成できますか?

編集:この質問はここに投稿された質問の複製であることが指摘されました。私の検索スキルは最初は失敗したようです。

4

3 に答える 3

3

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

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

更新:これを達成する方法について、Phil Haack がブログに投稿しているようです。彼のコードは RC 用ですが、ASP.NET MVC RTM に対しては問題なくコンパイルできるはずです。

于 2009-05-02T00:34:03.470 に答える
1

あなたはすでに答えを受け入れていることを知っていますが、 Phil Haackの投稿の助けを借りて、同じアイデアを実験しているときに私が思いついたものは次のとおりです。

まず、Viewフォルダの下のフォルダを探すために独自のViewEngineを用意する必要があります。このようなもの:(PhilHaackのエリアコードによく似ていることに気付くでしょう)

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、デフォルトのViewEngineをカスタムのものに置き換えますApplication_Start

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestViewEngine());

でルートを定義するときは、次のようにViewフォルダーの下で検索するフォルダーを示す値Global.asaxを設定する必要があります。root

routes.MapRoute(
    "ListManager",
    "ListManager/{action}/{id}",
    new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
 );
于 2009-05-02T14:56:51.260 に答える
0

この質問は、この質問の繰り返しです

そのため、ここでそれに対する私の答えを引用します。

独自のビュー エンジンをロールする必要のない別のソリューションを思いつきました。

基本的に、私は MVC を可能な限り「コンベンション」主導のままにしたかったのですが、それでもすべての「管理者」ビューを ~/Views/Admin フォルダーの下に整理したかったのです。

例:

  • 〜/ビュー/管理者/ユーザー/
  • 〜/ビュー/管理者/ニュース/
  • 〜/ビュー/管理者/ブログ/

私の解決策は、特定の管理コントローラーの新しい基本クラスを作成し、そのコントローラーのビューへのパスを「強制」することでした。

ここにブログ投稿とサンプル コードがあります: ASP.Net MVC でビューを整理する

于 2009-05-02T05:18:53.067 に答える