// 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.AspNet.Mvc.ViewFeatures.Logging; using Microsoft.Extensions.Logging; using Microsoft.Extensions.OptionsModel; namespace Microsoft.AspNet.Mvc.ViewFeatures { /// /// Finds and executes an for a . /// public class ViewResultExecutor : ViewExecutor { /// /// Creates a new . /// /// The . /// The . /// The . /// The . /// The . public ViewResultExecutor( 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, ViewResult 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.GetView(executingFilePath: null, viewPath: viewName, isPartial: false); if (!result.Success) { result = viewEngine.FindView(actionContext, viewName, isPartial: false); } if (result.Success) { if (DiagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.ViewFound")) { DiagnosticSource.Write( "Microsoft.AspNet.Mvc.ViewFound", new { actionContext = actionContext, isPartial = false, result = viewResult, viewName = viewName, view = result.View, }); } Logger.ViewFound(viewName); } else { if (DiagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.ViewNotFound")) { DiagnosticSource.Write( "Microsoft.AspNet.Mvc.ViewNotFound", new { actionContext = actionContext, isPartial = false, result = viewResult, viewName = viewName, searchedLocations = result.SearchedLocations }); } Logger.ViewNotFound(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, ViewResult 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.ViewResultExecuting(view); return ExecuteAsync( actionContext, view, viewResult.ViewData, viewResult.TempData, viewResult.ContentType, viewResult.StatusCode); } } }