// 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.Diagnostics; 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) { DiagnosticSource.ViewFound(actionContext, true, viewResult, viewName, result.View); Logger.LogVerbose("The partial view '{PartialViewName}' was found.", viewName); } else { DiagnosticSource.ViewNotFound(actionContext, true, viewResult, viewName, 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); } } }