1

私が探しているのは、果樹園のページの 2 つのビューを持つことです。

1 つ目はヘッダーとフッターを含み、2 つ目は本体のコンテンツのみを含みます。

その理由は、本体を 1 つの場所に維持できるようにするためであり、それをスタンドアロンのサイトとして使用するか、別のサイトに埋め込むだけです。

別のルートを使用してページにアクセスするか、クエリ文字列パラメーターを追加することで行われると思います。

その他のオプションは大歓迎です。

4

1 に答える 1

1

これから説明する方法は間違いなくハックであり、Orchard の作成者の意図の一部に反する可能性がありますが、仕事は完了します。

Orchard は、ThemeFilterwithThemed属性を使用して、現在のコントローラー アクションの出力を「テーマ化」するかどうか、つまりヘッダーとフッターを付けて表示するかどうかを決定します。オーチャードがコンテンツ アイテムを表示するために使用するコントローラーでは、この属性が有効になっています。これが、コンテンツ アイテムがテーマ付きで表示される理由です。あなたが求めているのは、クエリ文字列パラメーターの存在に基づいて、この「テーマ」モードを抑制することです。

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 コンテキストから を直接削除することで、同じことを行うことができます。ただし、これはカプセル化を壊すため、オブジェクト指向プログラミングではおそらく避けるべきです。

于 2013-11-21T16:47:03.453 に答える