아무도 액션 내에서 뷰의 생성 된 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
.
위의 @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);
}
I 조치를 호출 한 결과를 얻으려면 지금 Foo
, 나는 단순히를 얻을 수 ViewResult
호출에 의해 Foo
호출 다음 방법을, 그리고 RenderViewResultAsString
HTML 텍스트를 얻을 수 :
var viewResult = this.Foo(model, bar);
var html = this.RenderViewResultAsString(viewResult);
masterName
null을 지정하는 또 다른 매개 변수 ( )가 필요합니다 . 또한 현재 컨트롤러 인스턴스에서 메서드가 호출되고이 호출 전에 모델이 할당 된 경우 (렌더링 후) controller.ViewData.Model을 저장하고 복원하는 것이 좋습니다.