@Display.Shape() を実行するだけで、ゾーンを使用してテーマを作成し、モジュールからそのゾーンに形状をディスパッチできたため、頭の中で何かが接続されていません。したがって、ハンドラーを使用してBuildDisplayShape
.
繰り返しますが、これはプレーン レコードとしてモデルを使用するシナリオです (ContentItem または ContentPart を使用していない場合でも、それらを使用していない場合でも、移行によってモデルを作成する例を示しました)。
このようなもの - コントローラー:
public ShapeResult MyShape()
{
var shape = _orchardServices.New.MyPath1_MyShape();
return new ShapeResult(this, shape);
}
次に、私が持っているコードを使用して MyShape.cshtml シェイプを作成します (例は必要ありません)。
注:IShapeTemplateHarvester
図形を保存できるパスを追加するカスタム ファイルを使用します (Orchard のストックである「Views」、「Views/Items」、「Views/Parts」、「Views/Fields」を使用する代わりに)。次のようになります。
NB: コードが SO で自動的にラップされないのが嫌いです。
[OrchardSuppressDependency("Orchard.DisplayManagement
.Descriptors.ShapeTemplateStrategy.BasicShapeTemplateHarvester")]
public class MyShapeTemplateHarvester : BasicShapeTemplateHarvester,
IShapeTemplateHarvester
{
public new IEnumerable<string> SubPaths()
{
var paths = base.SubPaths().ToList();
paths.Add("Views/MyPath1");
paths.Add("Views/MyPath2");
return paths;
}
}
テーマに Index.cshtml があるとします。2 つの選択肢があります (両方を使用し、テーマをデフォルトのプレゼンテーションとして使用します)。
テーマ フォルダー内の Index.cshtml:
@*Default Content*@
Module フォルダー内の Index.cshtml:
@*Special Content overriding Theme's Index.cshtml*@
Display.MyPath1_MyShape()
私にとってさらに良いのは、これを Theme フォルダーの Index.cshtml で実行できることです。
@*Whatever content*@
Display.MyPath1_MySecondShape()
テーマには ~/MyPath1/MySecondShape.cshtml はありませんが、テーマが表示するモジュールには 1 つあります。これは素晴らしいことです。なぜなら、私は特別なテーマを持ち、複数のモジュール (別々のサイトに配置されている) をテーマに沿って行き来させることができるからです (異なるサイトの同じ職業の異なるサービスのダッシュボードを考えてみてください)。
IThemeSelector
注: 上記は、次のような実装でのみ可能です。
public class MyThemeSelector : IThemeSelector
{
public ThemeSelectorResult GetTheme(RequestContext context)
{
if (MyFilter.IsApplied(context))
{
return new ThemeSelectorResult { Priority = 200,
ThemeName = "MyDashboard" };
}
return null;
}
}
ちょうど私の2ビット。