97 votes

ASP.NET MVC, Razor: Comment rendre un Rasoir Vue Partielle du HTML à l'intérieur du contrôleur de l'action

Comment générer un code HTML d'une vue partielle sur la ASP.NET moteur d'affichage est connu.

Mais si cette fonctionnalité est utilisée sur de rasoir vue partielle, il ne fonctionne pas, comme l'exception, dit la vue partielle ne provient pas de l' "UserControl".

Comment fixer le rendu à l'appui de rasoir vue partielle?

J'ai besoin de cela parce que je générer des e-mails forme cette vue partielle sur ...

Mise à JOUR:

Code échec (@mcl):

public string RenderPartialToString(string controlName, object viewData)
    {
        ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
        viewPage.Url = this.GetUrlHelper();

        string fullControlName = "~/Views/Email/" + controlName + ".ascx";

        viewPage.ViewData = new ViewDataDictionary(viewData);
        viewPage.Controls.Add(viewPage.LoadControl(fullControlName));

        StringBuilder sb = new StringBuilder();
        using (StringWriter sw = new StringWriter(sb))
        {
            using (HtmlTextWriter tw = new HtmlTextWriter(sw))
            {
                viewPage.RenderControl(tw);
            }
        }
        return sb.ToString();
    }

153voto

jgauffin Points 51913
@Html.Partial("nameOfPartial", Model)

Mise à jour

protected string RenderPartialViewToString(string viewName, object model)
{
    if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.RouteData.GetRequiredString("action");

    ViewData.Model = model;

    using (StringWriter sw = new StringWriter()) {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
    }
}

8voto

Scott Terry Points 151

Bien que les réponses ont déjà été donné, je voudrais proposer un moins verbeux solution, qui peut être utilisé sans l'aide de méthodes disponibles dans un MVC contrôleur de classe. À l'aide d'un tiers bibliothèque appelée "RazorEngine" que vous pouvez utiliser .Net e / s de fichier pour obtenir le contenu du fichier de rasoir et d'appel

string html = Razor.Parse(razorViewContentString, modelObject);

D'obtenir la troisième partie de la bibliothèque ici.

5voto

Omu Points 17372

Vous pouvez également utiliser l' RenderView Controller extension d' ici

et de l'utiliser comme ceci:

public ActionResult Do() {
var html = this.RenderView("index", theModel);
...
}

il travaille pour le rasoir et formulaires web viewengines

2voto

martin Points 11
public static string RenderViewToString(Controller controller, string viewName, object model)
{
    var oldController = controller.RouteData.Values["controller"].ToString();

    if (controller.GetType() != typeof(EmailController))
        controller.RouteData.Values["controller"] = "Email";

    var oldModel = controller.ViewData.Model;
    controller.ViewData.Model = model;
    try
    {
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName,
                                                                       null);

            var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
            viewResult.View.Render(viewContext, sw);

            //Cleanup
            controller.ViewData.Model = oldModel;
            controller.RouteData.Values["controller"] = oldController;

            return sw.GetStringBuilder().ToString();
        }
    }
    catch (Exception ex)
    {
        Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

        throw ex;
    }
}

1voto

David Riewe Points 11

grand code; petite astuce: si vous avez parfois de contourner plus de données et pas seulement le viewmodel ..

 if (model is ViewDataDictionary)
 {
     controller.ViewData = model as ViewDataDictionary;
 } else {
     controller.ViewData.Model = model;
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X