mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Roughing out starting point of multi-pass rendering for theme support
--HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4044044
This commit is contained in:
15
src/Orchard/Mvc/Html/LayoutHelperExtensions.cs
Normal file
15
src/Orchard/Mvc/Html/LayoutHelperExtensions.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
using Orchard.Mvc.ViewEngines;
|
||||||
|
|
||||||
|
namespace Orchard.Mvc.Html {
|
||||||
|
public static class LayoutHelperExtensions {
|
||||||
|
public static void RenderBody(this HtmlHelper html) {
|
||||||
|
var layoutContext = OrchardLayoutContext.From(html.ViewContext);
|
||||||
|
html.ViewContext.HttpContext.Response.Output.Write(layoutContext.BodyContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
src/Orchard/Mvc/ViewEngines/LayoutView.cs
Normal file
35
src/Orchard/Mvc/ViewEngines/LayoutView.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
|
||||||
|
namespace Orchard.Mvc.ViewEngines {
|
||||||
|
public class LayoutView : IView {
|
||||||
|
private IView[] _views;
|
||||||
|
|
||||||
|
public LayoutView(IEnumerable<IView> views) {
|
||||||
|
_views = views.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Render(ViewContext viewContext, TextWriter writer) {
|
||||||
|
|
||||||
|
var orchardViewContext = OrchardLayoutContext.From(viewContext);
|
||||||
|
|
||||||
|
for (var index = 0; index != _views.Length; ++index)
|
||||||
|
{
|
||||||
|
var view = _views[index];
|
||||||
|
if (index == _views.Length - 1) {
|
||||||
|
view.Render(viewContext, writer);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//TEMP: to be replaced with an efficient spooling writer
|
||||||
|
var childWriter = new StringWriter();
|
||||||
|
view.Render(viewContext, childWriter);
|
||||||
|
orchardViewContext.BodyContent = childWriter.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
62
src/Orchard/Mvc/ViewEngines/LayoutViewEngine.cs
Normal file
62
src/Orchard/Mvc/ViewEngines/LayoutViewEngine.cs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
|
||||||
|
namespace Orchard.Mvc.ViewEngines {
|
||||||
|
public class LayoutViewEngine : IViewEngine {
|
||||||
|
private readonly ViewEngineCollection _viewEngines;
|
||||||
|
|
||||||
|
public LayoutViewEngine(ViewEngineCollection viewEngines) {
|
||||||
|
_viewEngines = viewEngines;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) {
|
||||||
|
return new ViewEngineResult(Enumerable.Empty<string>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ViewEngineResult FindView(
|
||||||
|
ControllerContext controllerContext,
|
||||||
|
string viewName,
|
||||||
|
string masterName,
|
||||||
|
bool useCache) {
|
||||||
|
|
||||||
|
// TODO: is there an optimization around useCache for
|
||||||
|
// this implementation? since IView can't re-execute, maybe not...
|
||||||
|
|
||||||
|
// if action returned a View with explicit master -
|
||||||
|
// this will bypass the multi-pass layout strategy
|
||||||
|
if (!string.IsNullOrEmpty(masterName))
|
||||||
|
return new ViewEngineResult(Enumerable.Empty<string>());
|
||||||
|
|
||||||
|
var bodyView = _viewEngines.FindPartialView(controllerContext, viewName);
|
||||||
|
var layoutView = _viewEngines.FindPartialView(controllerContext, "layout");
|
||||||
|
var documentView = _viewEngines.FindPartialView(controllerContext, "document");
|
||||||
|
|
||||||
|
if (bodyView.View == null ||
|
||||||
|
layoutView.View == null ||
|
||||||
|
documentView.View == null) {
|
||||||
|
|
||||||
|
return new ViewEngineResult(
|
||||||
|
(bodyView.SearchedLocations ?? Enumerable.Empty<string>())
|
||||||
|
.Concat((layoutView.SearchedLocations ?? Enumerable.Empty<string>()))
|
||||||
|
.Concat((documentView.SearchedLocations ?? Enumerable.Empty<string>()))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var view = new LayoutView(new[] {
|
||||||
|
bodyView.View,
|
||||||
|
layoutView.View,
|
||||||
|
documentView.View,
|
||||||
|
});
|
||||||
|
|
||||||
|
return new ViewEngineResult(view, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReleaseView(ControllerContext controllerContext, IView view) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
25
src/Orchard/Mvc/ViewEngines/OrchardLayoutContext.cs
Normal file
25
src/Orchard/Mvc/ViewEngines/OrchardLayoutContext.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
|
||||||
|
namespace Orchard.Mvc.ViewEngines {
|
||||||
|
public class OrchardLayoutContext {
|
||||||
|
private static readonly object _key = typeof(OrchardLayoutContext);
|
||||||
|
|
||||||
|
public string BodyContent { get; set; }
|
||||||
|
|
||||||
|
public static OrchardLayoutContext From(ControllerContext context) {
|
||||||
|
return From(context.HttpContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OrchardLayoutContext From(HttpContextBase context) {
|
||||||
|
if (context.Items.Contains(_key)) {
|
||||||
|
context.Items.Add(_key, new OrchardLayoutContext());
|
||||||
|
}
|
||||||
|
return (OrchardLayoutContext)context.Items[_key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -200,6 +200,7 @@
|
|||||||
<Compile Include="Mvc\Html\ContentItemExtensions.cs" />
|
<Compile Include="Mvc\Html\ContentItemExtensions.cs" />
|
||||||
<Compile Include="Mvc\Html\ItemDisplayExtensions.cs" />
|
<Compile Include="Mvc\Html\ItemDisplayExtensions.cs" />
|
||||||
<Compile Include="Mvc\Html\ItemEditorExtensions.cs" />
|
<Compile Include="Mvc\Html\ItemEditorExtensions.cs" />
|
||||||
|
<Compile Include="Mvc\Html\LayoutHelperExtensions.cs" />
|
||||||
<Compile Include="Mvc\Html\MvcFormAntiForgeryPost.cs" />
|
<Compile Include="Mvc\Html\MvcFormAntiForgeryPost.cs" />
|
||||||
<Compile Include="Mvc\MvcModule.cs" />
|
<Compile Include="Mvc\MvcModule.cs" />
|
||||||
<Compile Include="Mvc\Html\HtmlHelperExtensions.cs" />
|
<Compile Include="Mvc\Html\HtmlHelperExtensions.cs" />
|
||||||
@@ -213,6 +214,9 @@
|
|||||||
<Compile Include="Mvc\Results\NotFoundResult.cs" />
|
<Compile Include="Mvc\Results\NotFoundResult.cs" />
|
||||||
<Compile Include="Mvc\OrchardControllerIdentificationStrategy.cs" />
|
<Compile Include="Mvc\OrchardControllerIdentificationStrategy.cs" />
|
||||||
<Compile Include="Mvc\Routes\RouteExtensions.cs" />
|
<Compile Include="Mvc\Routes\RouteExtensions.cs" />
|
||||||
|
<Compile Include="Mvc\ViewEngines\LayoutView.cs" />
|
||||||
|
<Compile Include="Mvc\ViewEngines\LayoutViewEngine.cs" />
|
||||||
|
<Compile Include="Mvc\ViewEngines\OrchardLayoutContext.cs" />
|
||||||
<Compile Include="Mvc\ViewModels\AdminViewModel.cs" />
|
<Compile Include="Mvc\ViewModels\AdminViewModel.cs" />
|
||||||
<Compile Include="Mvc\ViewModels\BaseViewModel.cs" />
|
<Compile Include="Mvc\ViewModels\BaseViewModel.cs" />
|
||||||
<Compile Include="Mvc\ViewPage.cs">
|
<Compile Include="Mvc\ViewPage.cs">
|
||||||
|
Reference in New Issue
Block a user