Orchardcms 如何通过Url提取Orchard页面的主体

Orchardcms 如何通过Url提取Orchard页面的主体,orchardcms,Orchardcms,我想做的是有两个果园页面的视图 第一个将包括页眉和页脚,第二个只是主体内容 原因是我们可以将身体保持在一个地方,它将被用作一个独立的站点,或者仅仅嵌入另一个站点 我认为这可以通过使用不同的路由访问页面,或者附加querystring参数来完成 任何其他选择都是受欢迎的。我将要描述的方法可以说是一种黑客行为,可能违背了果园创造者的一些意图,但它会完成工作 Orchard使用ThemeFilter和Themed属性来决定当前控制器操作的输出是否为“主题化”——即显示页眉和页脚。Orchard用于显示

我想做的是有两个果园页面的视图

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

原因是我们可以将身体保持在一个地方,它将被用作一个独立的站点,或者仅仅嵌入另一个站点

我认为这可以通过使用不同的路由访问页面,或者附加querystring参数来完成


任何其他选择都是受欢迎的。

我将要描述的方法可以说是一种黑客行为,可能违背了果园创造者的一些意图,但它会完成工作

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;
    }
此类不提供取消应用此值的方法。如果您愿意修改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)
来执行相同的操作。然而,这破坏了封装,在面向对象编程中可能应该避免。

我将要描述的方法可以说是一种黑客行为,可能违背了Orchard创建者的一些意图,但它将完成这项工作

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;
    }
此类不提供取消应用此值的方法。如果您愿意修改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)
来执行相同的操作。然而,这破坏了封装,在面向对象编程中可能应该避免。

您是说使用果园内容项组成的果园页面吗?或者你自己的普通MVC页面?一个用orchard内容构建的页面。你必须构建自己的控制器。虽然如此,这并不是一个真正的问题,但我认为可能有一些问题。你知道这样做的例子吗?如果是这样的话,我将把它们标记为标题中的答案。你可以检查如何实现自定义控件。你是说使用果园内容项组成的果园页面吗?或者你自己的普通MVC页面?一个用orchard内容构建的页面。你必须构建自己的控制器。虽然如此,这并不是一个真正的问题,但我认为可能有一些问题。你知道这样做的例子吗?如果是这样的话,我会将它们标记为标题中的答案,您可以检查如何实现自定义控制器。