サーバー側イベント (リクエストなし) から部分ビューをレンダリングしようとしています。
コントローラーなしで部分ビューをレンダリングできる次のコードを見つけました。 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」も含まれているため、レーザー エンジンはコントローラーの外部でテンプレートを解析できないようです。