1

ASP.NET MVC がビューまたはパーシャルを検索するためのフォルダーをさらに定義することはできますか?

たとえば、/Home/Index を参照し、Index アクションが View() を返した場合、ASP.NET MVC は次の場所を参照します。

  • ~/Views/Home/Index.aspx
  • ~/Views/Home/Index.ascx
  • ~/Views/Shared/Index.aspx
  • 〜/Views/Shared/Index.ascx
  • ~/Views/Home/Index.cshtml
  • ~/Views/Home/Index.vbhtml
  • ~/ビュー/共有/Index.cshtml
  • 〜/ビュー/共有/Index.vbhtml

~/Views/PartivalViews/ など、別のフォルダーを作成して検索したいと考えています。

明らかに、PartialViews を格納するためのきちんとした方法としてこれを探しています。

4

2 に答える 2

5

custom view engineASP.NET MVC がビューを検索する追加のフォルダーを指定できる場所を記述できます。

ここでの考え方は、次のRazorViewEngineようなさまざまなプロパティから派生するクラスを作成し、そのコンストラクターで設定することです。

  • AreaViewLocationFormats
  • AreaMasterLocationFormats
  • AreaPartialViewLocationFormats
  • ViewLocationFormats
  • MasterLocationFormats
  • PartialViewLocationFormats

以下は、自由にオーバーライドできるデフォルト値です。

public RazorViewEngine(IViewPageActivator viewPageActivator) : base(viewPageActivator)
{
    base.AreaViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/{1}/{0}.vbhtml", "~/Areas/{2}/Views/Shared/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.vbhtml" };
    base.AreaMasterLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/{1}/{0}.vbhtml", "~/Areas/{2}/Views/Shared/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.vbhtml" };
    base.AreaPartialViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/{1}/{0}.vbhtml", "~/Areas/{2}/Views/Shared/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.vbhtml" };
    base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/{1}/{0}.vbhtml", "~/Views/Shared/{0}.cshtml", "~/Views/Shared/{0}.vbhtml" };
    base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/{1}/{0}.vbhtml", "~/Views/Shared/{0}.cshtml", "~/Views/Shared/{0}.vbhtml" };
    base.PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/{1}/{0}.vbhtml", "~/Views/Shared/{0}.cshtml", "~/Views/Shared/{0}.vbhtml" };
    base.FileExtensions = new string[] { "cshtml", "vbhtml" };
}

次に、カスタム ビュー エンジンを に登録しますApplication_Start

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

この例では、カスタム ビュー エンジンを登録する前に、他のすべての既定のビュー エンジン (WebForms と Razor) を削除しました。

于 2013-02-01T11:42:22.200 に答える
0

上記の Darin の回答からどのように進めるか疑問に思っている場合は、これが私が実装した方法です。すべてのクレジットは Darin と Owen に帰属します。

Views/Controller/Shared基本的に、すべての部分ビューをフォルダーの下に配置したかったのです。そのため、「RazorViewEngine」の「PartialViewLocationFormats」プロパティのみを置き換えました。~/Views/{1}/Shared/{0}.cshtmlViewEngine が最初に"Views/Controller/Shared" フォルダーを参照するように、" " をリストの最初の要素として追加しました。

次に、上記の global.asax で Darin が説明したように、既存のビュー エンジンをクリアして、新しいビュー エンジンを追加します。

ViewEngines.Engines.Add(new CustomRazorViewEngine());

これが誰かに役立つことを願っています。

public class CustomRazorViewEngine : RazorViewEngine
    {
        public CustomRazorViewEngine()
        {
            var newLocationFormat = new[]
                                    {
                                        "~/Views/{1}/Shared/{0}.cshtml",
                                        "~/Views/{1}/{0}.cshtml", 
                                        "~/Views/{1}/{0}.vbhtml", 
                                        "~/Views/Shared/{0}.cshtml", 
                                        "~/Views/Shared/{0}.vbhtml"
                                    };

            PartialViewLocationFormats = newLocationFormat;
        }

    }
于 2014-02-18T04:55:39.167 に答える