Files
Orchard/src/Orchard.Web/Core/Common/Handlers/RoutableAspectHandler.cs
2010-03-08 16:45:11 -08:00

57 lines
2.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Core.Common.Models;
using Orchard.Data;
namespace Orchard.Core.Common.Handlers {
[UsedImplicitly]
public class RoutableAspectHandler : ContentHandler {
private readonly IEnumerable<IContentItemDriver> _contentItemDrivers;
public RoutableAspectHandler(IRepository<RoutableRecord> repository, IEnumerable<IContentItemDriver> contentItemDrivers, UrlHelper urlHelper) {
_contentItemDrivers = contentItemDrivers;
Filters.Add(StorageFilter.For(repository));
OnGetEditorViewModel<RoutableAspect>((context, routable) => {
var currentDriver = GetDriver(context.ContentItem);
var tempContentItem = context.ContentItem.ContentManager.New(context.ContentItem.ContentType);
tempContentItem.As<RoutableAspect>().Slug = "ABCDEFG";
var routeValues = GetRouteValues(currentDriver, tempContentItem);
var url = urlHelper.RouteUrl(routeValues).Replace("/ABCDEFG", "");
if (url.StartsWith("/"))
url = url.Substring(1);
routable.ContentItemBasePath = url;
});
}
private static RouteValueDictionary GetRouteValues(IContentItemDriver driver, ContentItem contentItem) {
//TODO: (erikpo) Need to rearrange ContentItemDriver so reflection isn't needed here
var driverType = driver.GetType();
var method = driverType.GetMethod("GetDisplayRouteValues");
if (method != null) {
return (RouteValueDictionary)method.Invoke(driver, new object[] {contentItem.Get(driverType.BaseType.GetGenericArguments()[0])});
}
return null;
}
private IContentItemDriver GetDriver(ContentItem contentItem) {
return
_contentItemDrivers
.Where(cid => cid.GetContentTypes().Any(ct => string.Compare(ct.Name, contentItem.ContentType, true) == 0))
//TODO: (erikpo) SingleOrDefault should be called here, but for some reason, the amount of drivers registered is doubled sometimes.
.FirstOrDefault();
}
}
}