C# 访问Kentico自定义对象宏方法中的嵌套属性
我试图在Kentico(v8.2.x或v9.0)中编写一个宏方法,该方法被适当地缓存,并公开一个包含几个公共成员的POCO 在VisualStudio中调试时,我可以看到查询运行良好,并且返回的对象实例正是我想要的。此外,使用Kentico中的C# 访问Kentico自定义对象宏方法中的嵌套属性,c#,asp.net,kentico,C#,Asp.net,Kentico,我试图在Kentico(v8.2.x或v9.0)中编写一个宏方法,该方法被适当地缓存,并公开一个包含几个公共成员的POCO 在VisualStudio中调试时,我可以看到查询运行良好,并且返回的对象实例正是我想要的。此外,使用Kentico中的Debug应用程序检查缓存项也会显示完整的POCO实例数据已按预期进行缓存 但是,调用宏时,我似乎只能读取对象的字符串表示形式 它是一个扩展了CurrentUserInfo类型的宏,因此我尝试这样调用它: {% CurrentUser.ClientStat
Debug
应用程序检查缓存项也会显示完整的POCO实例数据已按预期进行缓存
但是,调用宏时,我似乎只能读取对象的字符串表示形式
它是一个扩展了CurrentUserInfo
类型的宏,因此我尝试这样调用它:
{% CurrentUser.ClientStatus() %}
{% CurrentUser.ClientStatus().Summary %}
但是尝试检索任何嵌套属性都失败
我确信这只是因为我没有做一些事情(比如正确注册这些属性)。但是从现在起,我看到了很多可能的事情。例如:
- 命名源
- 命名回调源
- 匿名来源
- 或者以某种方式将它们注册为单独的字段
/// <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;
}
}
对于我来说,以类似于以下方式访问属性的最简单方法是什么
{% CurrentUser.ClientStatus().ClientRecord["< Column Name >"] %}
{%CurrentUser.ClientStatus().ClientRecord[“”]%}
首先,我建议您使用系统->宏->控制台来测试您的宏-这非常有用。
在您的情况下,您应该能够访问如下属性:
{% CurrentUser.ClientStatus() %}
{% CurrentUser.ClientStatus().Summary %}
为了能够以您描述的方式访问属性,父对象必须是
DataRow
或DataRowView
类型,或实现以下接口之一:IVirtualHierarchicalObject
,IHierarchicalObject
,IDataContainer
,ISimpleDataContainer
在您的情况下,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.DataContainer
或IEnumerable
返回简单的对象值:
返回myCollection.Select(myObj=>newdatacontainer
{
[“Value1”]=myObj.Value1,
[“Value2”]=myObj.Value2
});
进一步阅读后,我认为在我的情况下,最好使用自定义模块。尽管如此,我还是会把问题留在这里,因为我喜欢K#macros,我相信理解如何让上述功能发挥作用仍然是有用的!好问题!关于宏的文档有点复杂,但这确实解决了我过去遇到的一些问题。我实现了所有的接口成员(除了集合
成员),它工作起来很有魅力!非常感谢