Added a page title builder and html helpers to build and display page title.

--HG--
extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4044209
This commit is contained in:
ErikPorter
2009-12-17 07:12:56 +00:00
parent 8625676409
commit 91c59ba232
8 changed files with 57 additions and 14 deletions

View File

@@ -5,7 +5,7 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title><%=Html.Title() %> - !!Safe Mode!!</title><%
<title><%=Html.Title("!!Safe Mode!!")%></title><%
Html.Zone("head", ":metas :styles :scripts"); %>
</head>
<body><%

View File

@@ -2,6 +2,7 @@
using System.Web.Mvc;
using Orchard.Mvc.ViewEngines;
using Orchard.Mvc.ViewModels;
using Orchard.UI.PageTitle;
using Orchard.UI.Resources;
using Orchard.UI.Zones;
@@ -14,33 +15,36 @@ namespace Orchard.Mvc.Html {
public static MvcHtmlString Body(this HtmlHelper html) {
OrchardLayoutContext layoutContext = OrchardLayoutContext.From(html.ViewContext);
return MvcHtmlString.Create(layoutContext.BodyContent);
}
public static void RenderTitle(this HtmlHelper html) {
OrchardLayoutContext layoutContext = OrchardLayoutContext.From(html.ViewContext);
html.ViewContext.HttpContext.Response.Output.Write(layoutContext.Title);
public static void AddTitleParts(this HtmlHelper html, params string[] titleParts) {
html.Resolve<IPageTitleBuilder>().AddTitleParts(titleParts);
}
public static MvcHtmlString Title(this HtmlHelper html) {
OrchardLayoutContext layoutContext = OrchardLayoutContext.From(html.ViewContext);
return MvcHtmlString.Create(html.Encode(layoutContext.Title));
public static MvcHtmlString Title(this HtmlHelper html, params string[] titleParts) {
IPageTitleBuilder pageTitleBuilder = html.Resolve<IPageTitleBuilder>();
pageTitleBuilder.AddTitleParts(titleParts);
return MvcHtmlString.Create(pageTitleBuilder.GenerateTitle());
}
public static void Zone<TModel>(this HtmlHelper<TModel> html, string zoneName, string partitions) where TModel : BaseViewModel {
//TODO: is IoC necessary for this to work properly?
var manager = new ZoneManager();
IZoneManager manager = html.Resolve<IZoneManager>();
manager.Render(html, html.ViewData.Model.Zones, zoneName, partitions);
}
public static void Zone<TModel>(this HtmlHelper<TModel> html, string zoneName) where TModel : BaseViewModel {
Zone(html, zoneName, string.Empty);
html.Zone(zoneName, string.Empty);
}
public static void Zone<TModel>(this HtmlHelper<TModel> html, string zoneName, Action action) where TModel : BaseViewModel {
//TODO: again, IoC could move this AddAction (or similar) method out of the data-bearing object
html.ViewData.Model.Zones.AddAction(zoneName, x => action());
Zone(html, zoneName, string.Empty);
html.Zone(zoneName, string.Empty);
}
public static void ZoneBody<TModel>(this HtmlHelper<TModel> html, string zoneName) where TModel : BaseViewModel {

View File

@@ -5,7 +5,6 @@ namespace Orchard.Mvc.ViewEngines {
public class OrchardLayoutContext {
private static readonly object _key = typeof(OrchardLayoutContext);
public string Title { get; set; }
public string BodyContent { get; set; }
public static OrchardLayoutContext From(ControllerContext context) {

View File

@@ -224,11 +224,14 @@
<Compile Include="Mvc\ViewEngines\WebFormsViewEngineProvider.cs" />
<Compile Include="Mvc\ViewModels\AdminViewModel.cs" />
<Compile Include="Mvc\ViewModels\BaseViewModel.cs" />
<Compile Include="UI\PageTitle\IPageTitleBuilder.cs" />
<Compile Include="UI\PageTitle\PageTitleBuilder.cs" />
<Compile Include="UI\Resources\IResourceManager.cs" />
<Compile Include="UI\Resources\ResourceFilter.cs" />
<Compile Include="UI\Resources\ResourceManager.cs" />
<Compile Include="UI\Zones\DelegateZoneItem.cs" />
<Compile Include="UI\Zones\ItemDisplayZoneItem.cs" />
<Compile Include="UI\Zones\IZoneManager.cs" />
<Compile Include="UI\Zones\RenderPartialZoneItem.cs" />
<Compile Include="UI\Zones\ZoneCollection.cs" />
<Compile Include="UI\Zones\ZoneEntry.cs" />

View File

@@ -0,0 +1,6 @@
namespace Orchard.UI.PageTitle {
public interface IPageTitleBuilder : IDependency {
void AddTitleParts(params string[] titleParts);
string GenerateTitle();
}
}

View File

@@ -0,0 +1,25 @@
using System.Collections.Generic;
using System.Linq;
namespace Orchard.UI.PageTitle {
public class PageTitleBuilder : IPageTitleBuilder {
private readonly List<string> _titleParts;
private readonly string _titleSeparator;
public PageTitleBuilder() {
_titleParts = new List<string>(5);
//TODO: (erikpo) Get this from a site setting
_titleSeparator = " - ";
}
public void AddTitleParts(params string[] titleParts) {
if (titleParts != null)
foreach (string titlePart in titleParts)
_titleParts.Add(titlePart);
}
public string GenerateTitle() {
return string.Join(_titleSeparator, _titleParts.AsEnumerable().Reverse().ToArray());
}
}
}

View File

@@ -0,0 +1,7 @@
using System.Web.Mvc;
namespace Orchard.UI.Zones {
public interface IZoneManager : IDependency {
void Render<TModel>(HtmlHelper<TModel> html, ZoneCollection zones, string zoneName, string partitions);
}
}

View File

@@ -1,11 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
namespace Orchard.UI.Zones {
public class ZoneManager {
public class ZoneManager : IZoneManager {
public void Render<TModel>(HtmlHelper<TModel> html, ZoneCollection zones, string zoneName, string partitions) {
ZoneEntry zone;