私は EPiServer 7 MVC を強化しており、Joel Abrahamsson のAlloy MVC Templateを試しました。ブロックをレンダリング可能な 4 つの異なる「サイズ」でプレビューする、カスタマイズされたプレビュー コントローラーを調べた後、特定のブロックの「サイズ」に固有のプロパティを作成して、見出しテキストをたとえば、ブロックがレンダリングする「サイズ」に基づいて異なるコンテンツを表示できます。基本的に、これはキーが「サイズ」で値が文字列の内容を含むディクショナリになります。
誰かがそのような Dictionary プロパティを作成しましたか?
私はいくつかのアプローチを試しましたが、それぞれに行き詰まりました:
カスタム プロパティ タイプ / カスタム値タイプ。カスタム プロパティ タイプの作成に関するこの例 ( http://joelabrahamsson.com/creating-a-custom-episerver-property-with-a-custom-class-as-value/ ) に従って、カスタム プロパティ タイプ (PropertyDicitionaryString) を作成しました。 ) およびカスタム値の型 (DictionaryString)。サイズのタグを受け取り、Model.MyDictionaryString[ViewData["Tag"] as string] をレンダリングする表示テンプレートを実装することで、値をうまく表示できます。ただし、 @Html.EditAttributes(x => x.MyDictionaryString[ViewData["Tag"] as string]) への呼び出しがサポートされていないため、インライン編集を機能させる方法を理解していません。そのメソッドは、ラムダ式でのインデックス呼び出しまたはメソッド呼び出しをサポートしていません)。 このようなインライン エディタの作成方法を知っている人はいますか?
カスタム プロパティ タイプ / プリミティブ タイプ。上記のカスタム プロパティ タイプを作り直しました。これを (PropertyDictionaryStringAsPrimitive) と呼び、Value プロパティが文字列を返すようにします。これにより、モデルを次のように定義できます。
[BackingType(typeof(PropertyDictionaryStringAsPrimitive)] public virtual string SizeSpecificString{get;set;}
Value メソッドが呼び出されたときに PropertyDictionaryStringAsPrimitive が現在のレンダリング コンテキストで「サイズ」を受け取り、正しい値が返されるようにする方法でハックする必要がありました。これは、PropertyDictionaryStringAsPrimitive.Value への呼び出しを探して Key を適切に設定するカスタム ContentDataInterceptor を実装することで実現できました。したがって、値の表示は正常に機能するようになりましたが、インライン編集もまったく機能しません。ajax 保存呼び出しが行われるとき、変更を保存するためにどのキーを使用するかを PropertyDictionaryStringAsPrimitive に伝えることができるように、いくつかの状態情報を追加する必要があります。 インライン編集 ajax 保存リクエスト中に追加の状態情報を返す方法を知っている人はいますか?
[CultureSpecific]
属性を見てみました。値の「サイズ」固有のインスタンスを保持するために、CultureSpecific と同様のメカニズムを使用できれば興味深いでしょう。CultureSpecific がどのように機能するかを逆コンパイラで調べた後、CotnentDataAttributeScanningAssigner.AssignValuesToPropertyDefinition が PropertyDefinitionModel.CultureSpecific フラグを true に設定するまでの属性を追跡しました。しかし、この設定が読み込まれる値にどのように影響するかはわかりませんでした。 プロパティレベルの属性を使用して値を動的に変更する方法を知っている人はいますか?