アクション内のビューの生成されたhtmlを取得する方法を誰かが知っていますか?
これは次のようなものですか?
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
回答:
呼び出したクラスの静的メソッドを使用して、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
。
this
、コントローラの引数として渡します。RenderPartialViewToString(this, "index", viewModel)
。ビューエンジンを呼び出して文字列を取得する簡単な方法はないのはばかげていると思いますが、ASP.NETでは、ビューをコンパイルするためにビューエンジンがコントローラーインスタンスを参照する必要があります。私は現在nodeJS開発者です。nodeのビューエンジンは、手動で、またはexpressのようなMVCフレームワークで呼び出すことができる完全に独立したモジュールです。
上記の@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
方法を、次に呼び出すRenderViewResultAsString
HTMLテキストを取得するには:
var viewResult = this.Foo(model, bar);
var html = this.RenderViewResultAsString(viewResult);
masterName
は、nullを指定する別のパラメーター()が必要です。また、現在のコントローラーインスタンスでメソッドが呼び出され、この呼び出しの前にモデルが割り当てられている場合に備えて、controller.ViewData.Modelを保存して復元することをお勧めします。