开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜