访问 Kentico 自定义对象宏方法中的嵌套属性

本文关键字:嵌套 属性 方法 Kentico 自定义 对象 访问 | 更新日期: 2023-09-27 18:32:48

我正在尝试在 Kentico (v8.2.x 或 v9.0( 中编写一个适当缓存的宏方法,并公开具有一些公共成员的 POCO。

在 Visual Studio 中调试时,我可以看到查询运行良好,并且完全按照我想要的方式返回对象实例。 此外,使用 Kentico 中的 Debug 应用程序检查缓存的项目还显示完整的 POCO 实例数据按预期缓存。

但是,在调用宏时,我似乎只能读取对象的字符串表示形式。

它是一个扩展CurrentUserInfo类型的宏,所以我尝试像这样调用它:

{% CurrentUser.ClientStatus() %}

但是尝试检索任何嵌套属性都会失败。

我敢肯定,这只是我没有做某事(例如正确注册这些属性(。 但是从文档中,我看到了很多可能的东西。 例如:

  • 命名源
  • 命名回调源
  • 匿名来源
  • 或者以某种方式将它们注册为单独的字段

下面是宏本身:

/// <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类非常简单:

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 >"] %}

访问 Kentico 自定义对象宏方法中的嵌套属性

为了能够以您描述的方式访问属性,父对象必须是DataRowDataRowView类型或实现以下接口之一:IVirtualHierarchicalObjectIHierarchicalObjectIDataContainerISimpleDataContainer

在您的情况下,ClientInfo应该实现IDataContainer。嵌套CustomTableItem已经实现了其中一个接口,因为它继承自AbstractInfo

您必须实现几个成员,这些成员主要使用名为 columnName 的参数来标识应返回其值的成员:

public class ClientInfo : IDataContainer
{
    ...
    public object GetValue(string columnName)
    {
        switch (columnName)
        {
            case "ClientRecord":
                return ClientRecord;
            case "Summary":
                return Summary;
            case "MediaPaths":
                return MediaPaths;
        }
        return null;
    }
    ...
}
在这种情况下

可能不起作用,但值得注意的是,您可以使用CMS.Base.DataContainerIEnumerable<CMS.Base.DataContainer>返回简单的对象值:

return myCollection.Select(myObj => new DataContainer
                {
                    ["Value1"] = myObj.Value1,
                    ["Value2"] = myObj.Value2
                });
首先,

我建议您使用System -> Macros -> Console来测试您的宏 - 它非常有用。在您的情况下,您应该能够访问如下属性:

{% CurrentUser.ClientStatus().Summary %}