我正在尝试从服务器端事件(无请求)呈现部分视图。
我发现以下代码能够在没有控制器的情况下呈现部分视图。 将 MVC PartialView 渲染到 SignalR 响应中
public static string RenderPartialView(string controllerName, string partialView, object model)
{
var context = new HttpContextWrapper(System.Web.HttpContext.Current) as HttpContextBase;
var routes = new System.Web.Routing.RouteData();
routes.Values.Add("controller", controllerName);
var requestContext = new RequestContext(context, routes);
string requiredString = requestContext.RouteData.GetRequiredString("controller");
var controllerFactory = ControllerBuilder.Current.GetControllerFactory();
var controller = controllerFactory.CreateController(requestContext, requiredString) as ControllerBase;
controller.ControllerContext = new ControllerContext(context, routes, controller);
var ViewData = new ViewDataDictionary();
var TempData = new TempDataDictionary();
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, partialView);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
这在客户端请求(SignalR/websocket)之后使用时可以正常工作,但如果代码由服务器端事件(WCF 连接到另一个应用程序)触发,则 HttpContext.Current = null 会导致错误。
我怎样才能使这项工作?
PS。我也尝试过 Razor Engine,但出现错误“无法编译模板。当前上下文中不存在名称‘Html’”。由于模板还包含“@Html”,因此剃须刀引擎似乎无法在控制器之外解析模板。