// 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);
}
}
}