[Themed] attribute signals the use Orchard theming w/out BaseViewModel

ThemeFilter detects attribute at action time or TModel at result time
LayoutViewEngine uses ThemeFilter.IsApplied the same way AdminFilter.IsApplied is used
Themed(false) at an action will override [Themed(true)] or [Themed] at a controller level

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-03-01 18:02:48 -08:00
parent 1fb4b305e4
commit a6f56b97d5
7 changed files with 81 additions and 3 deletions

View File

@@ -1,17 +1,23 @@
using System;
using System.Web.Mvc; using System.Web.Mvc;
using Orchard.DevTools.Models; using Orchard.DevTools.Models;
using Orchard.Localization;
using Orchard.Mvc.ViewModels; using Orchard.Mvc.ViewModels;
using Orchard.Themes;
using Orchard.UI.Notify; using Orchard.UI.Notify;
namespace Orchard.DevTools.Controllers { namespace Orchard.DevTools.Controllers {
//[Themed] [Themed]
public class HomeController : Controller { public class HomeController : Controller {
private readonly INotifier _notifier; private readonly INotifier _notifier;
public HomeController(INotifier notifier) { public HomeController(INotifier notifier) {
_notifier = notifier; _notifier = notifier;
T = NullLocalizer.Instance;
} }
public Localizer T { get; set; }
public ActionResult Index() { public ActionResult Index() {
return View(new BaseViewModel()); return View(new BaseViewModel());
} }
@@ -28,5 +34,15 @@ namespace Orchard.DevTools.Controllers {
public ActionResult _RenderableAction() { public ActionResult _RenderableAction() {
return PartialView("_RenderableAction", "This is render action"); return PartialView("_RenderableAction", "This is render action");
} }
public ActionResult SimpleMessage() {
_notifier.Information(T("Notifier works without BaseViewModel"));
return RedirectToAction("Simple");
}
[Themed(false)]
public ActionResult SimpleNoTheme() {
return View("Simple", new Simple { Title = "This is not themed", Quantity = 5 });
}
} }
} }

View File

@@ -8,3 +8,5 @@
<%= Model.Quantity %></p> <%= Model.Quantity %></p>
<div style="border: solid 1px #ccc;"> <div style="border: solid 1px #ccc;">
<% Html.RenderAction("_RenderableAction"); %></div> <% Html.RenderAction("_RenderableAction"); %></div>
<p>
<%=Html.ActionLink("Test Messages", "SimpleMessage")%></p>

View File

@@ -47,6 +47,7 @@ namespace Orchard.Environment.ShellBuilders {
builder.Register<MvcModule>().As<IModule>().ContainerScoped(); builder.Register<MvcModule>().As<IModule>().ContainerScoped();
builder.Register<WebFormsViewEngineProvider>().As<IViewEngineProvider>().ContainerScoped(); builder.Register<WebFormsViewEngineProvider>().As<IViewEngineProvider>().ContainerScoped();
builder.Register<ViewEngineFilter>().As<IFilterProvider>().ContainerScoped(); builder.Register<ViewEngineFilter>().As<IFilterProvider>().ContainerScoped();
builder.Register<ThemeFilter>().As<IFilterProvider>().ContainerScoped();
builder.Register<PageTitleBuilder>().As<IPageTitleBuilder>().ContainerScoped(); builder.Register<PageTitleBuilder>().As<IPageTitleBuilder>().ContainerScoped();
builder.Register<ZoneManager>().As<IZoneManager>().ContainerScoped(); builder.Register<ZoneManager>().As<IZoneManager>().ContainerScoped();
builder.Register<PageClassBuilder>().As<IPageClassBuilder>().ContainerScoped(); builder.Register<PageClassBuilder>().As<IPageClassBuilder>().ContainerScoped();

View File

@@ -2,6 +2,7 @@
using System.Linq; using System.Linq;
using System.Web.Mvc; using System.Web.Mvc;
using Orchard.Mvc.ViewModels; using Orchard.Mvc.ViewModels;
using Orchard.Themes;
namespace Orchard.Mvc.ViewEngines { namespace Orchard.Mvc.ViewEngines {
public class LayoutViewEngine : IViewEngine { public class LayoutViewEngine : IViewEngine {
@@ -24,6 +25,8 @@ namespace Orchard.Mvc.ViewEngines {
var skipLayoutViewEngine = false; var skipLayoutViewEngine = false;
if (string.IsNullOrEmpty(masterName) == false) if (string.IsNullOrEmpty(masterName) == false)
skipLayoutViewEngine = true; skipLayoutViewEngine = true;
if (!ThemeFilter.IsApplied(controllerContext.RequestContext))
skipLayoutViewEngine = true;
if (_viewEngines == null || _viewEngines.Count == 0) if (_viewEngines == null || _viewEngines.Count == 0)
skipLayoutViewEngine = true; skipLayoutViewEngine = true;
if (skipLayoutViewEngine) if (skipLayoutViewEngine)

View File

@@ -225,6 +225,7 @@
<Compile Include="Extensions\ExtensionDescriptor.cs" /> <Compile Include="Extensions\ExtensionDescriptor.cs" />
<Compile Include="Extensions\ExtensionEntry.cs" /> <Compile Include="Extensions\ExtensionEntry.cs" />
<Compile Include="IOrchardServices.cs" /> <Compile Include="IOrchardServices.cs" />
<Compile Include="Themes\ThemeFilter.cs" />
<Compile Include="Themes\ThemedAttribute.cs" /> <Compile Include="Themes\ThemedAttribute.cs" />
<Compile Include="UI\Admin\AdminAttribute.cs" /> <Compile Include="UI\Admin\AdminAttribute.cs" />
<Compile Include="UI\Admin\AdminFilter.cs" /> <Compile Include="UI\Admin\AdminFilter.cs" />

View File

@@ -0,0 +1,55 @@
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using Orchard.Mvc.Filters;
using Orchard.Mvc.ViewModels;
namespace Orchard.Themes {
public class ThemeFilter : FilterProvider, IActionFilter, IResultFilter {
public void OnActionExecuting(ActionExecutingContext filterContext) {
var attribute = GetThemedAttribute(filterContext.ActionDescriptor);
if (attribute != null && attribute.Enabled) {
Apply(filterContext.RequestContext);
}
}
public void OnActionExecuted(ActionExecutedContext filterContext) {
}
public void OnResultExecuting(ResultExecutingContext filterContext) {
var viewResult = filterContext.Result as ViewResult;
if (viewResult == null)
return;
var model = viewResult.ViewData.Model as BaseViewModel;
if (model == null)
return;
Apply(filterContext.RequestContext);
}
public void OnResultExecuted(ResultExecutedContext filterContext) {
}
public static void Apply(RequestContext context) {
// the value isn't important
context.HttpContext.Items[typeof(ThemeFilter)] = null;
}
public static bool IsApplied(RequestContext context) {
return context.HttpContext.Items.Contains(typeof(ThemeFilter));
}
private static ThemedAttribute GetThemedAttribute(ActionDescriptor descriptor) {
return descriptor.GetCustomAttributes(typeof(ThemedAttribute), true)
.Concat(descriptor.ControllerDescriptor.GetCustomAttributes(typeof(ThemedAttribute), true))
.OfType<ThemedAttribute>()
.FirstOrDefault();
}
}
}

View File

@@ -30,11 +30,11 @@ namespace Orchard.UI.Admin {
public static void Apply(RequestContext context) { public static void Apply(RequestContext context) {
// the value isn't important // the value isn't important
context.HttpContext.Items[typeof(AdminThemeSelector)] = null; context.HttpContext.Items[typeof(AdminFilter)] = null;
} }
public static bool IsApplied(RequestContext context) { public static bool IsApplied(RequestContext context) {
return context.HttpContext.Items.Contains(typeof(AdminThemeSelector)); return context.HttpContext.Items.Contains(typeof(AdminFilter));
} }
private static bool IsAdmin(AuthorizationContext filterContext) { private static bool IsAdmin(AuthorizationContext filterContext) {