私が探しているのは、果樹園のページの 2 つのビューを持つことです。
1 つ目はヘッダーとフッターを含み、2 つ目は本体のコンテンツのみを含みます。
その理由は、本体を 1 つの場所に維持できるようにするためであり、それをスタンドアロンのサイトとして使用するか、別のサイトに埋め込むだけです。
別のルートを使用してページにアクセスするか、クエリ文字列パラメーターを追加することで行われると思います。
その他のオプションは大歓迎です。
私が探しているのは、果樹園のページの 2 つのビューを持つことです。
1 つ目はヘッダーとフッターを含み、2 つ目は本体のコンテンツのみを含みます。
その理由は、本体を 1 つの場所に維持できるようにするためであり、それをスタンドアロンのサイトとして使用するか、別のサイトに埋め込むだけです。
別のルートを使用してページにアクセスするか、クエリ文字列パラメーターを追加することで行われると思います。
その他のオプションは大歓迎です。
これから説明する方法は間違いなくハックであり、Orchard の作成者の意図の一部に反する可能性がありますが、仕事は完了します。
Orchard は、ThemeFilter
withThemed
属性を使用して、現在のコントローラー アクションの出力を「テーマ化」するかどうか、つまりヘッダーとフッターを付けて表示するかどうかを決定します。オーチャードがコンテンツ アイテムを表示するために使用するコントローラーでは、この属性が有効になっています。これが、コンテンツ アイテムがテーマ付きで表示される理由です。あなたが求めているのは、クエリ文字列パラメーターの存在に基づいて、この「テーマ」モードを抑制することです。
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 ソース コードを変更したくない、または変更できない場合でもtypeof (ThemeFilter)
、フィルターの HTTP コンテキストから を直接削除することで、同じことを行うことができます。ただし、これはカプセル化を壊すため、オブジェクト指向プログラミングではおそらく避けるべきです。