Omu - essayez ces pour la taille:
public static class ExtensionMethods
{
// usage
/*
var model = _repository.Find(x => x.PropertyID > 3).FirstOrDefault();
var test = this.RenderViewToString("DataModel", model);
return Content(test);
*/
public static string RenderViewToString<T>(this ControllerBase controller,
string viewName, T model)
{
using (var writer = new StringWriter())
{
ViewEngineResult result = ViewEngines
.Engines
.FindView(controller.ControllerContext,
viewName, null);
var viewPath = ((WebFormView)result.View).ViewPath;
var view = new WebFormView(viewPath);
var vdd = new ViewDataDictionary<T>(model);
var viewCxt = new ViewContext(
controller.ControllerContext,
view,
vdd,
new TempDataDictionary(), writer);
viewCxt.View.Render(viewCxt, writer);
return writer.ToString();
}
}
public static string RenderPartialToString<T>(
this ControllerBase controller,
string partialName, T model)
{
var vd = new ViewDataDictionary(controller.ViewData);
var vp = new ViewPage
{
ViewData = vd,
ViewContext = new ViewContext(),
Url = new UrlHelper(controller.ControllerContext.RequestContext)
};
ViewEngineResult result = ViewEngines
.Engines
.FindPartialView(
controller.ControllerContext,
partialName);
if (result.View == null)
{
throw new InvalidOperationException(
string.Format("The partial view '{0}' could not be found",
partialName));
}
var partialPath = ((WebFormView)result.View).ViewPath;
vp.ViewData.Model = model;
Control control = vp.LoadControl(partialPath);
vp.Controls.Add(control);
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
using (var tw = new HtmlTextWriter(sw))
{
vp.RenderControl(tw);
}
}
return sb.ToString();
}
}
utilisation
(vue normale):
var s = this.RenderViewToString("Index", null); // or model if required
et pour une partie:
var s = this.RenderPartialToString("PartialView, model) // etc
oui, il y a quelques méthodes. va coller mes extensions mvc2 pour cela dans un post séparé. –
Voir cette réponse pour le rendu des vues en chaînes: http://stackoverflow.com/q/483091/261677 –