2013-09-11 1 views
1

Что я хочу сделать, так это иметь 2 вида страницы сада.Как я могу извлечь основную часть страницы Orchard через Url

Первый будет включать верхние и нижние колонтитулы, а второй - только основной материал.

Причина в том, что мы можем поддерживать тело в одном месте, и оно будет использоваться либо как отдельный сайт, либо просто встроено в другое.

Я думаю, что это будет сделано путем доступа к странице с использованием другого маршрута или добавления параметра querystring.

Любые другие варианты приветствуются.

+0

Вы говорите о странице Orchard, составленной с использованием элементов контента Orchards? Или ваша собственная простая страница MVC? – Hazza

+0

Страница, построенная с содержимым садов. – Martin

+0

Вам нужно будет создать свой собственный контроллер. –

ответ

1

Метод, который я собираюсь описать, возможно, взломан и может противоречить некоторым намерениям создателей Орчард, но он выполнит свою работу.

Orchard использует ThemeFilter с атрибутом Themed, чтобы решить, будет ли текущий выход действия контроллера «тематическим» --- т.е. отображаться с верхними и нижними колонтитулами. Контроллер, используемый Orchard для отображения элементов контента, включил этот атрибут, поэтому элементы контента отображаются тематически. То, что вы просите сделать, это подавить этот «тематический» режим на основе наличия параметра строки запроса.

ThemeFilter запускается на ранней стадии запроса страницы и применяет себя, устанавливая значение в контексте http-запроса текущего запроса.

ThemeFilter.cs:

public static void Apply(RequestContext context) { 
     // the value isn't important 
     context.HttpContext.Items[typeof (ThemeFilter)] = null; 
    } 

Этот класс не предоставляет способ ипа Apply ИНГ этого значения. Если вы готовы изменить исходный Orchard код, вы можете добавить этот метод себя:

public static void Unapply(RequestContext context) { 
     context.HttpContext.Items.Remove(typeof (ThemeFilter)); 
    } 

Тогда вы можете просто создать свой собственный фильтр действия, который проверяет наличие строки запроса, а затем вызывать этот метод при необходимости , что-то вроде:

using System.Web.Mvc; 
using Orchard.Mvc.Filters; 
using Orchard.Themes; 

namespace Demo { 
    public class UnthemeFilter : FilterProvider, IActionFilter { 
     public void OnActionExecuting(ActionExecutingContext filterContext) { 
     } 

     public void OnActionExecuted(ActionExecutedContext filterContext) { 
      if (filterContext.RequestContext.HttpContext.Request["unthemed"] != null) { 
       ThemeFilter.Unapply(filterContext.RequestContext); 
      } 
     } 
    } 
} 

Теперь, добавив ?unthemed=true, вы будете в состоянии подавить тематизации.

Если вы не хотите или не можете изменить исходный код Orchard, все равно можно сделать то же самое, удалив непосредственно из контекста HTTP в вашем фильтре typeof (ThemeFilter). Однако это нарушает инкапсуляцию и, вероятно, следует избегать в объектно-ориентированном программировании.

Смежные вопросы