В некоторых случаях объединение этих двух функций может принести огромную пользу. MVC не очень подходит для сайтов, ориентированных на контент. Тем не менее, веб-приложения со структурированным потоком и множественным представлением данных извлекают из этого огромную пользу Когда дело доходит до нескольких представлений данных, у Sitecore есть некоторое ограничение - вы можете определить только один набор деталей дизайна для элемента. Если у вас нет требований к редактированию WYSIWYG или простому предварительному просмотру одним щелчком, вы можете использовать Sitecore в качестве хранилища данных и использовать некоторые значения контекста, полученные из его конвейера (например, язык).
Для работы HTTP-конвейера Sitecore необходима пара модификаций:
1) При использовании расширения aspx в IIS6 для получения ASP.NET для обработки запросов MVC (например, /Controller.aspx/Action) исправьте синтаксический анализ SitePore FilePath (существует ошибка в том, как Sitecore разрешает FilePath, что приводит к путь рубят).
Чтобы это исправить, поместите новый процессор в начало конвейера httpRequestBegin.
public class MvcFixHttpProcessor : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
{
public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
{
//when using a path such as /Controller.aspx/Blahblahblah, Sitecore's parsing of FilePath can break if Blahblahblah is too long
RouteData routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(args.Context));
if (routeData != null)
{
args.Url.FilePath = args.Context.Request.Url.LocalPath;
}
}
}
(Изменить 13.09.2011: мне не приходилось использовать указанное выше исправление в течение некоторого времени.)
2) Скажите Sitecore игнорировать URL-адреса, которые направляются на ASP.NET MVC
Для этого поместите новый процессор в конвейер httpRequestBegin после ItemResolver.
public class SystemWebRoutingResolver : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
{
public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
{
RouteData routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(args.Context));
if (routeData != null)
{
args.AbortPipeline();
}
}
}
Если вы используете языки в своих URL-адресах Sitecore, вам нужно будет добавить некоторую настраиваемую логику, сочетающую генерацию ссылок Sitecore с генерацией MVC ActionLink, чтобы обеспечить добавление языка в начало вашего URL-адреса MVC. Однако с указанными выше конвейерными модификациями добавление языка в URL не должно иметь побочных эффектов при маршрутизации MVC (поскольку Sitecore переписывает URL после прочтения языка).
Еще раз, этот подход полезен только для определенных типов приложений. В этих случаях, однако, Sitecore создает отличный уровень данных для вашей модели. Изучите создание пользовательских оберток элементов для создания строго типизированных доменных объектов на основе элементов Sitecore.
(Редактировать 13.09.2011: Генератор пользовательских элементов отлично подходит для этого. http://blog.velir.com/index.php/2010/10/19/custom-item-generator/)
Удачи.