適切にキャッシュされたKentico(v8.2.xまたはv9.0)に1つのマクロメソッドを記述しようとしています。 。Kenticoカスタムオブジェクトマクロメソッドのネストされたプロパティへのアクセス
Visual Studioでデバッグすると、クエリが正常に実行されていることがわかり、オブジェクトのインスタンスが正確に返されます。さらに、KenticoのDebug
アプリケーションを使用してキャッシュされたアイテムを調べると、完全なPOCOインスタンスデータが期待どおりにキャッシュされていることもわかります。
しかし、マクロを呼び出すとき、私はオブジェクトの文字列表現を読むことができるようです。
それはCurrentUserInfo
型を拡張マクロですので、私はこのようにそれを起動しようとしています:
{% CurrentUser.ClientStatus() %}
しかし、ネストされたプロパティのいずれかが失敗した取得しようとします。
私はそれが私が(これらのプロパティを正しく登録するような)何かをしなかったことは確信しています。しかしdocumentationから、私はがであることができることの多くを見ました。たとえば:
-
ソース
- 名前のコールバック源名前
- 匿名ソース
- それともここで何とか
別々のフィールドとしてそれらを登録するには、マクロそのものです:
/// <summary>
/// A class containing custom user-extension macros.
/// </summary>
[assembly: RegisterExtension(typeof(CustomUserMacros), typeof(CurrentUserInfo))]
public class CustomUserMacros : MacroMethodContainer
{
/// <summary>
/// Retrieves data regarding user client.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="parameters">The parameters.</param>
/// <returns>Data regarding user client information.</returns>
[MacroMethod(typeof(ClientInfo), "Retrieves client info.", 1)]
[MacroMethodParam(0, "user", typeof(CurrentUserInfo), "The user.")]
public static object ClientStatus(
EvaluationContext context,
params object[] parameters)
{
ClientInfo retVal = null;
if (parameters != null && parameters.Length > 0
&& parameters[0].GetType() == typeof(CurrentUserInfo))
{
var siteName = SiteContext.CurrentSiteName;
var userGuid = ((CurrentUserInfo)parameters[0]).UserGUID;
var uInfo = UserInfoProvider.GetUserInfoByGUID(userGuid);
retVal = CacheHelper.Cache(
cs => new ClientInfo(uInfo, siteName),
new CacheSettings(
60,
typeof(CustomUserMacros),
"ClientStatus",
userGuid));
}
return retVal;
}
}
そしてClientInfo
clお尻はかなり単純明快です:
public class ClientInfo
{
public string Summary { get; private set; }
public CustomTableItem ClientRecord { get; private set; }
public IEnumerable<string> MediaPaths { get; private set; }
public ClientInfo(UserInfo userInfo, string siteCodeName) {
// ...
// Set properties, etc...
}
public override string ToString()
{
return Summary;
}
}
私は次のような方法で、プロパティにアクセスできるようにするための最も簡単な方法は何ですか?
{% CurrentUser.ClientStatus().ClientRecord["< Column Name >"] %}
を、私は私の場合には、このすべてが、代わりにカスタムモジュールでおそらく最高のオフだと思います。それにもかかわらず、私はK#マクロが好きなのでここで質問を残します。そして、私は上記のことをどのように働かせるかを理解することは依然として有用であると信じています! – ne1410s
良い質問です!マクロに関するドキュメントは少し複雑ですが、これは私が過去にしてきたいくつかの質問に対処しています。 –