以编程方式将视图渲染为字符串

Abd*_*bdo 6 c# asp.net asp.net-mvc asp.net-mvc-2

我想获取一个视图将在字符串中生成的html代码,在我的控制器中修改它,然后将其添加到我的JsonResult.

我发现代码可以完成我所说的部分内容.我想从aspx View中做到这一点.

- 额外说明:

假设我有一个页面Frame.aspx/Controller/Frame将返回

我希望在它出来之前得到响应,所以我可以用jsonp包装它.我不希望每次都在代码中编辑返回结果,这就是我想以编程方式加载视图的原因.

/ Controller/Frame当前返回Frame.aspx的内容: <html><body>hello</body></html>

假设有一个函数可以在字符串生成器中呈现视图

StringBuilder sb = new StringBuilder();
RenderView(sb, "Frame");
Run Code Online (Sandbox Code Playgroud)

现在拿sb并用jsonp包装它:

public JsonResult Frame(string callback)
{
     StringBuilder sb = new StringBuilder();
     RenderView(sb, "Frame");

     return new JsonResult
     {
         Data = "(function() { " + callback + "(" +  clientResponse + "); })();"
         ,
         JsonRequestBehavior = JsonRequestBehavior.AllowGet
     };
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*eer 19

这就像一个魅力(通过SO得到它).

我这样使用它:

public class OfferController : Controller
{
    [HttpPost]
    public JsonResult EditForm(int Id)
    {
        var model = Mapper.Map<Offer, OfferEditModel>(_repo.GetOffer(Id));

        return Json(new { status = "ok", partial = this.RenderPartialViewToString("Edit", model) });
    }
}



public static partial class ControllerExtensions
{
    public static string RenderPartialViewToString(this ControllerBase controller, string partialPath, object model)
    {
        if (string.IsNullOrEmpty(partialPath))
            partialPath = controller.ControllerContext.RouteData.GetRequiredString("action");

        controller.ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, partialPath);
            ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
            // copy model state items to the html helper 
            foreach (var item in viewContext.Controller.ViewData.ModelState)
                if (!viewContext.ViewData.ModelState.Keys.Contains(item.Key))
                {
                    viewContext.ViewData.ModelState.Add(item);
                }


            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如何使用.NET CORE执行相同的操作? (2认同)