asp.net-mvc - visual - web config mvc




In MVC3 Razor, come posso ottenere l'html di una vista renderizzata all'interno di un'azione? (2)

Qualcuno sa come ottenere l'html generato di una vista all'interno di un'azione?

È qualcosa di simile a questo:

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

La risposta accettata da @Chev sopra è buona, ma volevo rendere il risultato di un'azione specifica, non solo di una vista particolare.

Inoltre, avevo bisogno di essere in grado di passare i parametri a quell'azione piuttosto che fare affidamento sull'iniettare un modello.

Così ho inventato il mio metodo, che ho inserito nella classe base dei miei controller (rendendoli disponibili a tutti):

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

Supponiamo che io abbia un'azione chiamata Foo che prende un oggetto modello e alcuni altri parametri, che insieme influenzano quale vista verrà usata:

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

Ora, se voglio ottenere il risultato dell'azione chiamata Foo , posso semplicemente ottenere ViewResult invocando il metodo Foo e quindi chiamare RenderViewResultAsString per ottenere il testo HTML:

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

    var html = this.RenderViewResultAsString(viewResult);

Uso un metodo statico in una classe che ho chiamato Utilities.Common . Passo di nuovo le viste al client come proprietà degli oggetti JSON costantemente, quindi ho avuto bisogno di renderle a una stringa. Ecco qua:

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

Questo funzionerà per visualizzazioni complete e viste parziali, basta cambiare ViewEngines.Engines.FindPartialView a ViewEngines.Engines.FindView .







razor