0

次のようなビューフォルダー構造があります。

Views
    Rooms
        Resorts
            Index.cshtml
            Suites.cshtml
            .....

コントローラのフォルダ構成を合わせたい

Controllers
    Rooms
        ResortsController.cs

新しいマップルートを追加しました

        routes.MapRoute(
            name: "Rooms",
            url: "Rooms/{controller}/{action}/{id}",
            defaults: new {controller = "Resorts", action = "Index", id = UrlParameter.Optional}
            );

しかし、ビューのコントローラーが見つかりません。localhost/Rooms と localhost/Rooms/Resorts/Index を試しました -

どちらも同じ結果です。

私は何が欠けていますか?

編集: URL は、ビジネス要件ごとに部屋/リゾート/スイートなどのように見える必要があり、エリアを使用せずにこれを行う必要があります。Rooms/Resorts/Suites、Rooms/Suites/Suites、Rooms/AwesomeSuites/Suites など、同じアクション名を使用する複数の URL があります。そのため、サブ フォルダを使用して整理し、スイートという名前の複数のビューを作成することにはポイントがあります。

エリアを使わなくてもできることはありますか?

4

3 に答える 3

0

私の知る限り、ルーティングは作成した追加のフォルダー (Rooms) を気にしないため、Views/Rooms/Resorts からではなく、Views/Resorts/ からビューを解決しようとする可能性が最も高いです。構造内の別の場所に ResortsController を配置するなど、そのような分離が必要な場合は、Areas を使用する必要があります。たとえば、Rooms! という名前のエリアを作成できます。

于 2013-05-15T17:40:50.793 に答える
0

問題を解決しました。質問でマップされたルートを使用し、実装したフォルダー構造をそのまま維持して、ビューを探すためのパスを動的に作成するカスタム ビュー エンジンを作成しました。

public class CustomRazorViewEngine : RazorViewEngine
{
    public CustomRazorViewEngine()
    {
        ViewLocationFormats = new string[] { "~/Views/%1/{1}/{0}.cshtml"};
        MasterLocationFormats = new string[] { "~/Views/%1/{1}/{0}.cshtml",
                       "~/Views/Shared/%1/{0}.cshtml"};
        PartialViewLocationFormats = new string[] { "~/Views/Rooms/{1}/{0}.cshtml",
                        "~/Views/Shared/%1/{0}.cshtml"};
        FileExtensions = new string[] { "cshtml"};
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        var path = GetPath(controllerContext.Controller.GetType().Namespace);
        return base.CreatePartialView(controllerContext, partialPath.Replace("%1", path));
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        var path = GetPath(controllerContext.Controller.GetType().Namespace);
        return base.CreateView(controllerContext, viewPath.Replace("%1", path), masterPath.Replace("%1", path));
    }

    protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
    {
        var path = GetPath(controllerContext.Controller.GetType().Namespace);
        return base.FileExists(controllerContext, virtualPath.Replace("%1", path));
    }


    private string GetPath(string nameSpace)
    {
        var split = nameSpace.Split('.');
        int startingIndex = 0;
        StringBuilder sb = new StringBuilder();

        foreach(string s in split)
        {
            startingIndex++;

            if (s == "Controllers")
            {
                break;
            }
        }

        for(int x = startingIndex; x < split.Length; x++)
        {
            sb.Append(split[x]);
            if (x != split.Length - 1)
            {
                sb.Append("/");
            }
        }

        return sb.ToString();
    }

そのため、フォルダー構造が View フォルダーと Controllers フォルダーで同じである限り、CustomRazorViewEngine はビューを見つけます。

于 2013-05-16T17:44:42.083 に答える
0

試すことができますか:

routes.MapRoute( "Rooms", "Rooms/Resorts/{id}", new {controller = "Resorts", action = "Index", id = UrlParameter.Optional} );

于 2013-05-15T23:18:58.523 に答える