0

現在、(通常の場所に加えて) 1 つのエリアを使用する MVC4 アプリがあります。通常、私のルーティングではすべてが正常に機能していますが、領域内にある部分的なビューを見つけるために「ルート」の場所にコードが必要になりました。

私のソリューションのファイルの関連部分は次のとおりです。

/Areas
/Areas/Admin
/Areas/Admin/Views
/Areas/Admin/Views/Shared/_adminPartialView.cshtml
/Views
/Views/Shared/_rootPartialView.cshtml

そして、私の失敗したコードは次のとおりです。

var viewEngine = new RazorViewEngine();
var cContext = new ControllerContext(context, new RouteData(), new EmptyController());

// this works:
var rootView = viewEngine.FindPartialView(cContext, "_rootPartialView", false);
if (rootView == null) { throw new Exception("Root view not found"); }

// this throws my error:
var adminView = viewEngine.FindPartialView(cContext, "_adminPartialView", false);
if (adminView == null) { throw new Exception("Admin view not found"); }

(context上記は HttpContext.Current から間接的に来ています)

...これは理にかなっています。エリアが指定されていない場合、管理エリアは検索されるべきではありません...しかし、viewEngine上記をに変更すると、次のように = new AdminRazorViewEngine();定義されます。

public class AdminRazorViewEngine : RazorViewEngine {
    public AdminRazorViewEngine() {
        var viewLocations = new [] {
            "~/Areas/Admin/Views/{1}/{0}.cshtml",
            "~/Areas/Admin/Views/Shared/{0}.cshtml"
        };
        base.ViewLocationFormats = viewLocations.Concat(base.ViewLocationFormats).ToArray();
    }
}   

それでも同じ結果が得られます。

にコピー_adminPartialView.cshtmlすると/Views/Shared/、いずれかのビュー エンジンを使用して、両方のビューが正しく検出されます。

また、実際の RouteData オブジェクトを作成し、その上に Area を指定して、ControllerContext を構築するときにそれを使用しようとしました。

var routeData = new RouteData();
routeDate.Values.Add("area", "Admin");
// ...
var cContext = new ControllerContext(context, routeData, new EmptyController());

行動に変化はありません。

ビュー エンジンが検索する領域を明示的に指定するにはどうすればよいですか?

4

1 に答える 1

0

AreaViewLocationFormats代わりに設定してみてくださいViewLocationFormats

これは、ILSpy のコードです。RazorViewEngine

    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"
        };
    }
于 2013-08-28T20:21:58.350 に答える