2020-05-11 20:29:38 +02:00
using System ;
using System.Collections.Specialized ;
using Umbraco.Core ;
using Umbraco.Core.Cache ;
using Umbraco.Core.Logging ;
using Umbraco.Core.Models.PublishedContent ;
using Umbraco.Core.Persistence ;
using Umbraco.Core.Services ;
using Umbraco.Web.Common.Controllers ;
using Umbraco.Web.Routing ;
using Umbraco.Web.Website.ActionResults ;
namespace Umbraco.Web.Website.Controllers
{
/// <summary>
/// Provides a base class for front-end add-in controllers.
/// </summary>
2020-05-12 20:28:40 +02:00
// TODO: Migrate MergeModelStateToChildAction and MergeParentContextViewData action filters
// [MergeModelStateToChildAction]
// [MergeParentContextViewData]
2020-05-11 20:29:38 +02:00
public abstract class SurfaceController : PluginController
{
private readonly IPublishedUrlProvider _publishedUrlProvider ;
/// <summary>
/// Gets the current page.
/// </summary>
protected virtual IPublishedContent CurrentPage
{
get
{
var routeDefAttempt = TryGetRouteDefinitionFromAncestorViewContexts ( ) ;
if ( routeDefAttempt . Success = = false )
throw routeDefAttempt . Exception ;
var routeDef = routeDefAttempt . Result ;
return routeDef . PublishedRequest . PublishedContent ;
}
}
protected SurfaceController ( IUmbracoContextAccessor umbracoContextAccessor , IUmbracoDatabaseFactory databaseFactory , ServiceContext services , AppCaches appCaches , ILogger logger , IProfilingLogger profilingLogger , IPublishedUrlProvider publishedUrlProvider )
: base ( umbracoContextAccessor , databaseFactory , services , appCaches , logger , profilingLogger )
{
_publishedUrlProvider = publishedUrlProvider ;
}
/// <summary>
/// Redirects to the Umbraco page with the given id
/// </summary>
/// <param name="pageId"></param>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToUmbracoPage ( int pageId )
{
2020-05-12 19:12:57 +02:00
return new RedirectToUmbracoPageResult ( pageId , _publishedUrlProvider , UmbracoContextAccessor ) ;
2020-05-11 20:29:38 +02:00
}
/// <summary>
2020-05-12 19:12:57 +02:00
/// Redirects to the Umbraco page with the given id and passes provided querystring
2020-05-11 20:29:38 +02:00
/// </summary>
/// <param name="pageId"></param>
/// <param name="queryStringValues"></param>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToUmbracoPage ( int pageId , NameValueCollection queryStringValues )
{
2020-05-12 19:12:57 +02:00
return new RedirectToUmbracoPageResult ( pageId , queryStringValues , _publishedUrlProvider , UmbracoContextAccessor ) ;
2020-05-11 20:29:38 +02:00
}
/// <summary>
/// Redirects to the Umbraco page with the given id and passes provided querystring
/// </summary>
/// <param name="pageId"></param>
/// <param name="queryString"></param>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToUmbracoPage ( int pageId , string queryString )
{
2020-05-12 19:12:57 +02:00
return new RedirectToUmbracoPageResult ( pageId , queryString , _publishedUrlProvider , UmbracoContextAccessor ) ;
2020-05-11 20:29:38 +02:00
}
/// <summary>
/// Redirects to the Umbraco page with the given published content
/// </summary>
/// <param name="publishedContent"></param>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToUmbracoPage ( IPublishedContent publishedContent )
{
return new RedirectToUmbracoPageResult ( publishedContent , _publishedUrlProvider , UmbracoContextAccessor ) ;
}
/// <summary>
/// Redirects to the Umbraco page with the given published content and passes provided querystring
/// </summary>
/// <param name="publishedContent"></param>
/// <param name="queryStringValues"></param>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToUmbracoPage ( IPublishedContent publishedContent , NameValueCollection queryStringValues )
{
return new RedirectToUmbracoPageResult ( publishedContent , queryStringValues , _publishedUrlProvider , UmbracoContextAccessor ) ;
}
/// <summary>
/// Redirects to the Umbraco page with the given published content and passes provided querystring
/// </summary>
/// <param name="publishedContent"></param>
/// <param name="queryString"></param>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToUmbracoPage ( IPublishedContent publishedContent , string queryString )
{
return new RedirectToUmbracoPageResult ( publishedContent , queryString , _publishedUrlProvider , UmbracoContextAccessor ) ;
}
/// <summary>
/// Redirects to the currently rendered Umbraco page
/// </summary>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToCurrentUmbracoPage ( )
{
return new RedirectToUmbracoPageResult ( CurrentPage , _publishedUrlProvider , UmbracoContextAccessor ) ;
}
/// <summary>
/// Redirects to the currently rendered Umbraco page and passes provided querystring
/// </summary>
/// <param name="queryStringValues"></param>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToCurrentUmbracoPage ( NameValueCollection queryStringValues )
{
return new RedirectToUmbracoPageResult ( CurrentPage , queryStringValues , _publishedUrlProvider , UmbracoContextAccessor ) ;
}
/// <summary>
/// Redirects to the currently rendered Umbraco page and passes provided querystring
/// </summary>
/// <param name="queryString"></param>
/// <returns></returns>
protected RedirectToUmbracoPageResult RedirectToCurrentUmbracoPage ( string queryString )
{
return new RedirectToUmbracoPageResult ( CurrentPage , queryString , _publishedUrlProvider , UmbracoContextAccessor ) ;
}
/// <summary>
/// Redirects to the currently rendered Umbraco URL
/// </summary>
/// <returns></returns>
/// <remarks>
/// This is useful if you need to redirect
/// to the current page but the current page is actually a rewritten URL normally done with something like
/// Server.Transfer.*
/// </remarks>
protected RedirectToUmbracoUrlResult RedirectToCurrentUmbracoUrl ( )
{
return new RedirectToUmbracoUrlResult ( UmbracoContext ) ;
}
/// <summary>
/// Returns the currently rendered Umbraco page
/// </summary>
/// <returns></returns>
protected UmbracoPageResult CurrentUmbracoPage ( )
{
return new UmbracoPageResult ( ProfilingLogger ) ;
}
/// <summary>
/// we need to recursively find the route definition based on the parent view context
/// </summary>
/// <returns></returns>
private Attempt < RouteDefinition > TryGetRouteDefinitionFromAncestorViewContexts ( )
{
var currentContext = ControllerContext ;
while ( ! ( currentContext is null ) )
{
var currentRouteData = currentContext . RouteData ;
if ( currentRouteData . DataTokens . ContainsKey ( Core . Constants . Web . UmbracoRouteDefinitionDataToken ) )
return Attempt . Succeed ( ( RouteDefinition ) currentRouteData . DataTokens [ Core . Constants . Web . UmbracoRouteDefinitionDataToken ] ) ;
}
return Attempt < RouteDefinition > . Fail (
new InvalidOperationException ( "Cannot find the Umbraco route definition in the route values, the request must be made in the context of an Umbraco request" ) ) ;
}
}
}