gpt4 book ai didi

c# - 在 Kentico 自定义对象宏方法中访问嵌套属性

转载 作者:太空狗 更新时间:2023-10-29 21:43:45 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

在您的情况下,ClientInfo 应该实现 IDataContainer。嵌套的 CustomTableItem 已经实现了其中一个接口(interface),因为它继承自 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;
}
...
}

关于c# - 在 Kentico 自定义对象宏方法中访问嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35150193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com