// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Diagnostics; using System.Threading.Tasks; using Microsoft.AspNet.Mvc.Infrastructure; using Microsoft.AspNet.Mvc.Logging; using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.Extensions.Logging; using Microsoft.Extensions.OptionsModel; namespace Microsoft.AspNet.Mvc.ViewFeatures { /// /// Finds and executes an for a . /// public class PartialViewResultExecutor : ViewExecutor { /// /// Creates a new . /// /// The . /// The . /// The . /// The . /// The . public PartialViewResultExecutor( IOptions viewOptions, IHttpResponseStreamWriterFactory writerFactory, ICompositeViewEngine viewEngine, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory) : base(viewOptions, writerFactory, viewEngine, diagnosticSource) { if (loggerFactory == null) { throw new ArgumentNullException(nameof(loggerFactory)); } Logger = loggerFactory.CreateLogger(); } /// /// Gets the . /// protected ILogger Logger { get; } /// /// Attempts to find the associated with . /// /// The associated with the current request. /// The . /// A . public virtual ViewEngineResult FindView(ActionContext actionContext, PartialViewResult viewResult) { if (actionContext == null) { throw new ArgumentNullException(nameof(actionContext)); } if (viewResult == null) { throw new ArgumentNullException(nameof(viewResult)); } var viewEngine = viewResult.ViewEngine ?? ViewEngine; var viewName = viewResult.ViewName ?? actionContext.ActionDescriptor.Name; var result = viewEngine.FindPartialView(actionContext, viewName); if (result.Success) { if (DiagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.ViewFound")) { DiagnosticSource.Write( "Microsoft.AspNet.Mvc.ViewFound", new { actionContext = actionContext, isPartial = true, result = viewResult, viewName = viewName, view = result.View, }); } Logger.LogVerbose("The partial view '{PartialViewName}' was found.", viewName); } else { if (DiagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.ViewNotFound")) { DiagnosticSource.Write( "Microsoft.AspNet.Mvc.ViewNotFound", new { actionContext = actionContext, isPartial = true, result = viewResult, viewName = viewName, searchedLocations = result.SearchedLocations }); } Logger.LogError( "The partial view '{PartialViewName}' was not found. Searched locations: {SearchedViewLocations}", viewName, result.SearchedLocations); } return result; } /// /// Executes the asynchronously. /// /// The associated with the current request. /// The . /// The . /// A which will complete when view execution is completed. public virtual Task ExecuteAsync(ActionContext actionContext, IView view, PartialViewResult viewResult) { if (actionContext == null) { throw new ArgumentNullException(nameof(actionContext)); } if (view == null) { throw new ArgumentNullException(nameof(view)); } if (viewResult == null) { throw new ArgumentNullException(nameof(viewResult)); } Logger.PartialViewResultExecuting(view); return ExecuteAsync( actionContext, view, viewResult.ViewData, viewResult.TempData, viewResult.ContentType, viewResult.StatusCode); } } }