1

文字列へのビューのレンダリングは何度も尋ねられてきましたが、私の質問は異なります。

ViewEngineResult.Viewと呼ばれるメソッドがありますRender(ViewContext, TextWriter)

メールビューを格納するコントローラーを渡せばコードは正常に機能しますが、アクションメソッドが別のコントローラーで発生した場合は、ViewContextを変更してEmailControllersビューを表示できるようにする必要があります。

メソッドがどのビューフォルダーを検索するかを把握するためにどのプロパティを使用しているかを正確に把握できませんRender。基本的に、メールビューフォルダーを検索するように指示できるように、それを把握しようとしています。

参考までに私のコードは次のとおりです。

public static string RenderPartialViewToString(Controller controller, string viewName, object model)
    {
        var oldModel = controller.ViewData.Model;
        controller.ViewData.Model = model;
        try
        {
            using (var sw = new StringWriter())
            {
                var viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName,
                                                                           null);

                var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);

                controller.ViewData.Model = oldModel;
                return sw.GetStringBuilder().ToString();
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

要約すると、Orders ControllerにFindView、Ordersビューフォルダー内のビューを探すように渡す場合、Eメールビューフォルダーを探すように指示する必要があります。

4

1 に答える 1

1

ViewEngineはを調べて、ロードするファイルをRouteData決定します。.cshtml具体的には、controllerおよびactionプロパティ。使用したいコントローラー名を渡すこともできますが(おそらく推奨されます)Email、以下のコードで今のところハードコーディングしていることがわかります。

public static string RenderPartialViewToString(Controller controller, string viewName, object model)
{
    var oldModel = controller.ViewData.Model;
    controller.ViewData.Model = model;
    try
    {
        using (var sw = new StringWriter())
        {

            controller.RouteData.Values["controller"] = "Email";

            var viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, null);

            var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);

            viewResult.View.Render(viewContext, sw);

            controller.ViewData.Model = oldModel;
            return sw.GetStringBuilder().ToString();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

あなたが本当に知りたいのならもっとたくさん

Razorには、使用するビューを決定しようとするときに探す場所がいくつかあります。{0}これがアクション(またはビュー名で渡される)で{1}あり、コントローラーです。

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

{2}どちらがエリアかを除いて、ここと同じです。

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

これらのパラメーターはすべてRouteDataから取得されます(特に。などのパラメーターを介して上書きされない限りView("viewname")。これらの値を変更することでaction、MVCの動作方法をいくつか変更できます。選択する前に使用するコントローラーの決定を含みます。アクションと同じです。およびエリア。controllerarea

お役に立てれば。

于 2012-04-27T15:57:45.373 に答える