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.FindPartialViewViewEngines.Engines.FindView.


14
FindView에는 masterNamenull을 지정하는 또 다른 매개 변수 ( )가 필요합니다 . 또한 현재 컨트롤러 인스턴스에서 메서드가 호출되고이 호출 전에 모델이 할당 된 경우 (렌더링 후) controller.ViewData.Model을 저장하고 복원하는 것이 좋습니다.
Andrei Rî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

5
@PauloManuelSantos 동의합니다. 나는 몇 년 전에 썼고 대답에 오류 처리를 포함하여 내가 무슨 생각을했는지 모르겠습니다. try / catch를 제외하도록 답변을 업데이트했습니다. 피드백을 주셔서 감사합니다.
Chev

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);
    }

I 조치를 호출 한 결과를 얻으려면 지금 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.