how to get the result of an action (html) in a string variable
is it possible to get the result of an action into a s开发者_开发百科tring variable
I need something like this:
public ActionResult Do()
{
var s = this.Index().GetStringResult();
...
}
Omu - try these for size:
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();
}
}
usage (normal view):
var s = this.RenderViewToString("Index", null); // or model if required
and for a partial:
var s = this.RenderPartialToString("PartialView, model) // etc
Why not take the Index action and extract all it's code into a seperate function like this:
public ActionResult Index()
{
Response.Write(GetActionString());
return new EmptyResult();
}
private void GetActionString()
{
//Code which produces the index string;
}
public ActionResult Do()
{
var s = GetActionString();
...
return View();
}
If you are in need of the rendered HTML from index after it has been passed to a view then you will need to create an HttpRequest in code and read the result from this.
精彩评论