背景: ホームページに代替レイアウトを作成することは避けたいと思います。「The Theme Machine」ゾーンとレイアウトをそのまま維持し、実際には純粋な CSS を使用してほとんどすべてを「テーマ」にしたいと考えています。そのため、CSS を特定の「ページ」に選択的にターゲティングする必要があります。これには、最も重要なこととして、ホームページが含まれます。これを行う最も簡単な方法は、レイアウト全体をラップするレイアウト ラッパー「div」にクラスを追加することです。Document.cshtml ファイルをオーバーライドして「body」要素にクラスを追加することもできますが、Layout.chstml ファイル内で作業し、Model.Classes を活用して必要な CSS クラスを「オープニング」タグ。
私は現在、次のようなことをしています:
string area = Model.DesignatedAreaField;
Model.Classes.Add(string.IsNullOrWhiteSpace(area) ? "home" : area);
Model.Id = "layout-wrapper";
var tag = Tag(Model, "div"); // using Tag so the layout div gets the classes, id and other attributes added to the Model
ホームページと他のページはすべて同じ領域にあり、Model.DesignatedAreaField は実際にはホームページまたは他のページのいずれかに対して空の文字列を返すため、Area がカットされないことはわかっています。したがって、最終的に、上記のコードは常に次のマークアップを生成します (ホームページに 3 つのトリプルを表示しています)。
<div class="home tripel-123" id="layout-wrapper">
ホームページが表示されているときだけ、「ホーム」CSS クラスを追加できるようにしたいと考えています。一部の疑似コードは次のようになります。
string wrapperCss = IsHomepage ? 'home' : Model.GetUrlPathOrSomethingUniqueForThePath();
Model.Classes.Add(wrapperCss);
これにより、たとえば、メイン コンテンツを縮小して右にフロートさせ、トリプルをその左側に配置できます (これがホームページのデザインの外観ですが、まったく異なるレイアウトを作成する必要はありません)。シンプルでターゲットを絞った CSS で同じことができれば)。
更新:バートランドの答えを配線する
Bertrand の回答により、URL に応じてラッピング DIV にクラスを追加することができました。彼はそれについて言及しませんでした (Orchard は彼にとって第二の性質であるため :-) が、Layout.cshtml ファイルにインクルードを追加し、それに応じて "my" コードを変更する必要があります。
@using Orchard.Utility.Extensions;
{
/* omitted for brevity, everything in between is the same as in the Theme's Machine layout file */
string area = WorkContext.HttpContext.Request.Path.HtmlClassify();
area = string.IsNullOrWhiteSpace(area) ? "home" : area;
Model.Classes.Add("url-" + area);
次のクラスが外側の div に追加されます。
1) ホームページが表示されたら:
<div class="url-orchard-local- tripel-123" id="layout-wrapper">
2) Products という名前のページが表示された場合:
<div class="url-orchard-local-products" id="layout-wrapper">
私の URL は、Visual Studio の Web サーバー内で実行されている開発マシンで次のように読み取ります。
http://localhost:30320/OrchardLocal/ or
http://localhost:30320/OrchardLocal/Products
私は自分の人生を賭けているわけではありませんが、「OrchardLocal」の部分は、Azure サーバーに公開されると本番環境で変更されると強く信じています...したがって、コードを次のように先制的に変更しました。
string area = WorkContext.HttpContext.Request.Path.HtmlClassify();
if (area.LastOrDefault() == '-') {
area = "home";
}
Model.Classes.Add("url-" + area);
「ホームページ」が表示されると、次のクラスになります。
<div class="url-home tripel-123" id="layout-wrapper">
(実際には、ラムダ演算子と混合されたいくつかの三項を悪用するワンライナーの上のコードを作成しました:-)
HtmlClassify が「-」で終わる「クラス」を返すのは、それがホームページの場合だけだと推測しています...またはサイトの「ルート」...私は間違っているかもしれません! :-)
(とにかく、私は nHibernate 以外で過去数年間使用してきた何よりも Orchard を愛していますが、Orchard もそれを使用しています!完璧です!)