我正在做从episerver 11到12的迁移,在视图中有这个问题:
在所有的block和@section中。PropertyFor总是得到这个异常:
Microsoft.AspNetCore.Server.IIS.Core.IISHttpServer[2]
Connection ID "17293822592188153887", Request ID "80000020-0005-f000-b63f-84710c7967bb": An unhandled exception was thrown by the application.
System.NullReferenceException: Object reference not set to an instance of an object.
at EPiServer.Web.HttpContextExtensions.ContentRenderingContext(HttpContext httpContext)
at EPiServer.Web.Mvc.Html.Internal.DeferredHtmlContent..ctor(Action`1 action, HttpContext httpContext)
at EPiServer.Web.Mvc.Html.PropertyRenderer.GetHtmlForDefaultMode[TModel,TValue](String propertyName, String templateName, String elementName, String elementCssClass, Func`2 displayForAction)
at EPiServer.Web.Mvc.Html.PropertyRenderer.PropertyFor[TModel,TValue](IHtmlHelper`1 html, String viewModelPropertyName, Object additionalViewData, Object editorSettings, Expression`1 expression, Func`2 displayForAction)
at EPiServer.Web.Mvc.Html.PropertyExtensions.PropertyFor[TModel,TValue](IHtmlHelper`1 html, Expression`1 expression)
at AspNetCore.Areas_Main_Views_Shared_Layouts__BaseHtmlBlock.ExecuteAsync() in *MY VIEW NAME*
我已经调试了反编译的代码和在ContentRenderingContext HttpContextAccessor存在,但HttpContext里面是空的。
当我尝试在块控制器中注入IHttpContextAccessor时,它有HttpContext null。
但是-如果我试图得到它在页面控制器和页面视图(@Html.PropertyFor)它工作得很好a和HttpContext存在。
在Startup.cs中,我将其应用如下:
services.AddHttpContextAccessor();
怎么了?我还需要做什么吗?
编辑:如果我这样做,那么错误解决了,但这看起来不太好,我不想到处复制粘贴它。
部分:
@section Footer {
@{
ServiceLocator.Current.GetInstance<IHttpContextAccessor>().HttpContext = Context;
}
@Html.PropertyFor(x => x.CurrentPage.FooterBottomContentArea)
}
For Block(在InvokeComponent中注入HttpContextAccessor之后):
HttpContextAccessor.HttpContext = HttpContext;
我们发现这个问题在较新版本的episerver中得到了解决,我们从12.3更新到12.6,PropertyFor现在可以在任何地方工作了。
我反编译了它,我看到在GetHtmlForDefaultMode中,它在最新版本中使用WrappedHtmlContent,根本不使用HttpContextAccessor。