3

次のようなビューを持つパスのルート値があるとします

new
{
    controller = "Home",
    action = "Index"
}

これを にマップするにはどうすればよい~/Views/Home/Index.cshtmlですか?

すべてのビューに必ずしもアクションがあるとは限らず、すべてのアクションが必ずしもビューを返すとは限らないことを知っているので、それが問題になる可能性があります。

アップデート:

多分このようなもの:

IView view = ViewEngines.Engines.FindView(ControllerContext, "Index").View;
view.GetViewPath();

しかし、それにより、自分の controllerContext を使用したいと仮定する代わりに、コントローラーを指定することができます (または、必要な Controller (文字列) の controllerContext をモックアップすることさえできます..

4

2 に答える 2

2

これが私がやった方法です:

private string GetPhysicalPath(string viewName, string controller)
{
    ControllerContext context = CloneControllerContext();

    if (!controller.NullOrEmpty())
    {
        context.RouteData.Values["controller"] = controller;
    }
    if (viewName.NullOrEmpty())
    {
        viewName = context.RouteData.GetActionString();
    }
    IView view = ViewEngines.Engines.FindView(viewName, context).View;
    string physicalPath = view.GetViewPath();
    return physicalPath;
}

の拡張メソッドGetViewPathは次のとおりです。

public static string GetViewPath(this IView view)
{
    BuildManagerCompiledView buildManagerCompiledView = view as BuildManagerCompiledView;
    if (buildManagerCompiledView == null)
    {
        return null;
    }
    else
    {
        return buildManagerCompiledView.ViewPath;
    }
}

そしてCloneControllerContext次のとおりです。

private ControllerContext CloneControllerContext()
{
    ControllerContext context = new ControllerContext(Request.RequestContext, this);
    return context;
}
于 2012-07-23T00:44:58.177 に答える
1

RazorViewEngine.cs (mvc3 ソース内) から、ビューの検索パスは次のようになります (剃刀を想定)。

    ViewLocationFormats = new[] {
        "~/Views/{1}/{0}.cshtml",
        "~/Views/{1}/{0}.vbhtml",
        "~/Views/Shared/{0}.cshtml",
        "~/Views/Shared/{0}.vbhtml"
    };

{1} はコントローラーのルート値を参照し、{0} はビュー名です (ルート値の一部ではありません)。

これらの場所を検索して、基準に一致するビューを見つけようとすることができますが、作成している仮定の数を理解する必要もあります...つまり、ビューがアクションと同じ名前を持っていること (デフォルトでは yes ですが、そうでない場合はそうではありません)コントローラーのアクションでの View の呼び出しでビュー名を指定します)。あなたはすでに他のいくつかの仮定について言及しました

于 2012-07-23T00:24:00.460 に答える