MVC3 Razorで、アクション内のレンダリングされたビューのHTMLを取得するにはどうすればよいですか?


90

アクション内のビューの生成されたhtmlを取得する方法を誰かが知っていますか?

これは次のようなものですか?

public ActionResult Do()
{
    var html = RenderView("hello", model);
...
}

回答:


152

呼び出したクラスの静的メソッドを使用して、Utilities.Commonビューを常にJSONオブジェクトのプロパティとしてクライアントに返しているので、それらを文字列にレンダリングする必要がありました。ここに行きます:

public static string RenderPartialViewToString(Controller controller, string viewName, object model)
{
    controller.ViewData.Model = model;
    using (StringWriter sw = new StringWriter())
    {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
        viewResult.View.Render(viewContext, sw);

        return sw.ToString();
    }
}

これは、完全なビューと部分的なビューの両方で機能します。単にに変更ViewEngines.Engines.FindPartialViewしてくださいViewEngines.Engines.FindView


14
FindViewにmasterNameは、nullを指定する別のパラメーター()が必要です。また、現在のコントローラーインスタンスでメソッドが呼び出され、この呼び出しの前にモデルが割り当てられている場合に備えて、controller.ViewData.Modelを保存して復元することをお勧めします。
AndreiRînea

4
また、viewResult.ViewEngine.ReleaseView(controller.ControllerContext、viewResult.View)を呼び出す必要があります
sjmeverett

3
これはうまく機能しますが、ライブコードで例外をキャッチしてレンダリングしたくありません。
pauloya 2013年

3
コントローラ自体から呼び出す場合はthis、コントローラの引数として渡します。RenderPartialViewToString(this, "index", viewModel)。ビューエンジンを呼び出して文字列を取得する簡単な方法はないのはばかげていると思いますが、ASP.NETでは、ビューをコンパイルするためにビューエンジンがコントローラーインスタンスを参照する必要があります。私は現在nodeJS開発者です。nodeのビューエンジンは、手動で、またはexpressのようなMVCフレームワークで呼び出すことができる完全に独立したモジュールです。
Chev 2013年

5
@PauloManuelSantos同意します。私はこの数年前に書いたのですが、エラー処理を回答に含めて何を考えていたのかわかりません。答えを更新して、try / catchを除外しました。フィードバックをお寄せいただきありがとうございます。
Chev 2013年

4

上記の@Chevによる承認された回答は良いですが、特定のビューだけでなく、特定のアクションの結果をレンダリングしたいと思いました。

また、モデルの注入に依存するのではなく、そのアクションにパラメーターを渡すことができる必要がありました。

だから私は自分のメソッドを思いつきました、それをコントローラーの基本クラスに入れました(それらをすべての人が利用できるようにします):

    protected string RenderViewResultAsString(ViewResult viewResult)
    {
        using (var stringWriter = new StringWriter())
        {
            this.RenderViewResult(viewResult, stringWriter);

            return stringWriter.ToString();
        }
    }

    protected void RenderViewResult(ViewResult viewResult, TextWriter textWriter)
    {
        var viewEngineResult = this.ViewEngineCollection.FindView(
            this.ControllerContext, 
            viewResult.ViewName, 
            viewResult.MasterName);
        var view = viewEngineResult.View;

        try
        {
            var viewContext = new ViewContext(
                this.ControllerContext, 
                view, 
                this.ViewData, 
                this.TempData, 
                textWriter);

            view.Render(viewContext, textWriter);
        }
        finally
        {
            viewEngineResult.ViewEngine.ReleaseView(this.ControllerContext, view);
        }
    }

Foo使用されるビューに影響を与えるモデルオブジェクトと他のいくつかのパラメーターを取得するというアクションがあるとします。

    public ViewResult Foo(MyModel model, int bar)
    {
        if (bar == 1)
            return this.View("Bar1");
        else
            return this.View("Bar2", model);
    }

私はアクションの呼び出しの結果を取得したい場合は今、Foo私は単純に取得することができますViewResult呼び出すことによってFoo方法を、次に呼び出すRenderViewResultAsStringHTMLテキストを取得するには:

    var viewResult = this.Foo(model, bar);

    var html = this.RenderViewResultAsString(viewResult);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.