1

我要做的是对果园页面进行 2 次查看。

第一个将包括页眉和页脚,第二个只是主体内容。

原因是我们可以将身体保持在一个地方,它可以作为一个独立的站点使用,或者只是嵌入到另一个站点中。

我认为这将通过使用不同的路由访问页面或附加查询字符串参数来完成。

欢迎任何其他选择。

4

1 回答 1

1

我将要描述的方法可以说是一种 hack,可能会违背 Orchard 创建者的某些意图,但它会完成工作。

Orchard 使用ThemeFilterwithThemed属性来决定当前控制器操作的输出是否将是“主题” --- 即显示页眉和页脚。Orchard 用于显示内容项的控制器启用了此属性,这就是内容项显示为主题的原因。您要求做的是根据查询字符串参数的存在来抑制这种“主题”模式。

ThemeFilter在页面请求的早期阶段启动并通过在当前请求的 http 上下文中设置一个值来应用自身。

主题过滤器.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 源代码,仍然可以通过直接typeof (ThemeFilter)从过滤器中的 HTTP 上下文中删除 来做同样的事情。但是,这破坏了封装,在面向对象编程中应该避免。

于 2013-11-21T16:47:03.453 回答