Fix #4998 - Resolve IViewComponentHelper every time
This change resolves the scoped IViewComponentHelper every time its needed, rather than misusing a shared instance. IViewComponentHelper is stateful, so sharing an instance was the cause of this bug.
This commit is contained in:
parent
8a6e99c7c0
commit
bc76c0ef31
|
|
@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Mvc.Internal;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
using Microsoft.AspNetCore.WebUtilities;
|
using Microsoft.AspNetCore.WebUtilities;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
|
|
@ -22,11 +23,9 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
|
||||||
private readonly ILogger<ViewComponentResult> _logger;
|
private readonly ILogger<ViewComponentResult> _logger;
|
||||||
private readonly IModelMetadataProvider _modelMetadataProvider;
|
private readonly IModelMetadataProvider _modelMetadataProvider;
|
||||||
private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;
|
private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;
|
||||||
private readonly IViewComponentHelper _viewComponentHelper;
|
|
||||||
|
|
||||||
public ViewComponentResultExecutor(
|
public ViewComponentResultExecutor(
|
||||||
IOptions<MvcViewOptions> mvcHelperOptions,
|
IOptions<MvcViewOptions> mvcHelperOptions,
|
||||||
IViewComponentHelper viewComponentHelper,
|
|
||||||
ILoggerFactory loggerFactory,
|
ILoggerFactory loggerFactory,
|
||||||
HtmlEncoder htmlEncoder,
|
HtmlEncoder htmlEncoder,
|
||||||
IModelMetadataProvider modelMetadataProvider,
|
IModelMetadataProvider modelMetadataProvider,
|
||||||
|
|
@ -37,11 +36,6 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
|
||||||
throw new ArgumentNullException(nameof(mvcHelperOptions));
|
throw new ArgumentNullException(nameof(mvcHelperOptions));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (viewComponentHelper == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(viewComponentHelper));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (loggerFactory == null)
|
if (loggerFactory == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(loggerFactory));
|
throw new ArgumentNullException(nameof(loggerFactory));
|
||||||
|
|
@ -63,7 +57,6 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
|
||||||
}
|
}
|
||||||
|
|
||||||
_htmlHelperOptions = mvcHelperOptions.Value.HtmlHelperOptions;
|
_htmlHelperOptions = mvcHelperOptions.Value.HtmlHelperOptions;
|
||||||
_viewComponentHelper = viewComponentHelper;
|
|
||||||
_logger = loggerFactory.CreateLogger<ViewComponentResult>();
|
_logger = loggerFactory.CreateLogger<ViewComponentResult>();
|
||||||
_htmlEncoder = htmlEncoder;
|
_htmlEncoder = htmlEncoder;
|
||||||
_modelMetadataProvider = modelMetadataProvider;
|
_modelMetadataProvider = modelMetadataProvider;
|
||||||
|
|
@ -112,8 +105,11 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
|
||||||
writer,
|
writer,
|
||||||
_htmlHelperOptions);
|
_htmlHelperOptions);
|
||||||
|
|
||||||
(_viewComponentHelper as IViewContextAware)?.Contextualize(viewContext);
|
// IViewComponentHelper is stateful, we want to make sure to retrieve it every time we need it.
|
||||||
var result = await GetViewComponentResult(_viewComponentHelper, _logger, viewComponentResult);
|
var viewComponentHelper = context.HttpContext.RequestServices.GetRequiredService<IViewComponentHelper>();
|
||||||
|
(viewComponentHelper as IViewContextAware)?.Contextualize(viewContext);
|
||||||
|
|
||||||
|
var result = await GetViewComponentResult(viewComponentHelper, _logger, viewComponentResult);
|
||||||
|
|
||||||
result.WriteTo(writer, _htmlEncoder);
|
result.WriteTo(writer, _htmlEncoder);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue