我正在使用在 json 对象中返回 Html 的解决方案。如果这样做有任何问题,请告诉我。这是我的做法。
用于渲染部分视图的控制器扩展(包含但未在此解决方案中使用的是 RenderViewToString)。这可以在不同的答案中以各种形式找到,这些答案似乎与我不认为的我的定制版本不匹配。
namespace System.Web.Mvc
{
using System.IO;
public static class MvcControllerExtension
{
public static string RenderPartialViewToString(this Controller controller, string viewName = null, object model = null)
{
if (string.IsNullOrEmpty(viewName))
{
viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
}
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
public static string RenderViewToString(this Controller controller, string viewName = null, object model = null, string masterName = null)
{
if (string.IsNullOrEmpty(viewName))
{
viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
}
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, masterName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
}
}
在返回 JsonResult 的控制器动作中
public JsonResult _DisplayByFoo(int catId)
{
var myRealModel = new MyRealModel(catId);
// .... omitted the construction of MyRealModel
var jsonModel = new JsonModel(myRealModel);
jsonModel.Html = this.RenderPartialViewToString("_Display", myRealModel);
return Json(jsonModel);
}
我还在 json 对象上包含其他属性,这些属性可以帮助我确定我的插入模式。
在 Js 中;在我的 AjaxCall 到 Json 操作之后。运行 OnSuccess 方法,除其他逻辑外,该方法执行以下操作。
$("#" + targetId).append(MyJson.Html);