ne1*_*10s 6 c# asp.net kentico
我正在尝试在Kentico(v8.2.x或v9.0)中编写一个适当缓存的单个宏方法,并使用一些公共成员公开POCO.
在Visual Studio中进行调试,我可以看到查询运行正常,并且确切地返回了一个对象实例.此外,使用DebugKentico中的应用程序检查缓存的项目还显示完整的POCO实例数据按预期缓存.
但是,在调用宏时,我似乎只能读取对象的字符串表示形式.
它是一个扩展CurrentUserInfo类型的宏,所以我试图像这样调用它:
{% CurrentUser.ClientStatus() %}
Run Code Online (Sandbox Code Playgroud)
但尝试检索任何嵌套属性失败.
我确信这只是我没有做某事(比如正确注册这些属性).但是从文档中我看到了很多可能的东西.例如:
这是宏本身:
/// <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;
}
}
Run Code Online (Sandbox Code Playgroud)
而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;
}
}
Run Code Online (Sandbox Code Playgroud)
以类似于以下方式访问属性的最简单方法是什么?
{% CurrentUser.ClientStatus().ClientRecord["< Column Name >"] %}
Run Code Online (Sandbox Code Playgroud)
为了能够在你所描述的方式来访问属性,父对象必须是的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;
}
...
}
Run Code Online (Sandbox Code Playgroud)