我目前正在开发一个项目,我们需要在模板中使用Enums。我创建了以下类,以允许我在DotLiquid模板中访问我的枚举。
/// <summary>
/// Liquid Component created to provide support for specified Enumerations.
/// </summary>
public class EnumSupportComponent : ILiquidComponent
{
private readonly static Type[] EnumTypes =
{
typeof(DeliveryType),
typeof(MessageFormat),
typeof(OrderMethod),
typeof(PaymentMethod)
};
public void Register()
{
foreach (Type type in EnumTypes)
{
Template.RegisterSafeType(type, LocalizeEnum);
}
}
/// <summary>
/// Localizes an enum.
/// </summary>
/// <param name="o">Object (enum member) to localize.</param>
/// <returns></returns>
private static object LocalizeEnum(object o)
{
var objType = o.GetType();
var value = LocalizationHelper.GetLocalizedValue(o, objType);
return value;
}
/// <summary>
/// Map the variables to the right spot.
/// </summary>
/// <param name="parameters"></param>
public static void MapVariables(RenderParameters parameters)
{
foreach (Type enumType in EnumTypes)
{
var members = enumType.GetEnumValues();
foreach (var member in members)
{
var key = String.Format("{0}.{1}", enumType.Name, member);
parameters.LocalVariables.Add(key, LocalizeEnum(member));
}
}
}
}
Register方法由我的IoC容器调用,“LiquidComponent”确实注册没有问题。但是,当我的模板遇到以下几点时,它总是落在else块中,我不明白为什么。没有错误,只是错误的结果。
<tr>
<th style="text-align: left; padding-right: 10px;">Transaction status:</th>
<td style="padding: 5px 0px;">
{% if Model.PaymentMethod == PaymentMethod.Online %}
{{ Model.TransactionStatus }}
{% else %}
N/A
{% endif %}
</td>
</tr>
我不想解决这个问题。我虽然{{Model.PaymentMethod}}在那时会被解释为一个字符串,但事实并非如此。我删除了本地化只有枚举本身,但行为是相同的(事实上,枚举不再本地化)。在这种情况下,我想避免创建一个新的Block来测试相等性。我在网上搜索,但似乎没有答案。
我还在官方论坛上发布了这个问题:https://groups.google.com/forum/#!topic/dotliquid/hU4hnOYjCnY
答案 0 :(得分:1)
问题可能出在MapVariables
:
var key = String.Format("{0}.{1}", enumType.Name, member);
parameters.LocalVariables.Add(key, LocalizeEnum(member));
我不认为用&#34;添加密钥。&#34;在它中将按预期工作(它应该抛出异常)。此外,不是member
一个整数,所以赢得key
最终会像PaymentMethod.0
那样?
你可以试试这个:
foreach (Type enumType in EnumTypes)
{
var members = enumType.GetEnumValues();
var enumWrapper = new Dictionary<string, object>();
foreach (var member in members)
valueWrapper.Add(enumType.GetEnumName(member), member);
parameters.LocalVariables.Add(enumType.Name, enumWrapper);
}
(我忽略了LocalizeEnum
,因为我不知道它是返回字符串还是整数。)
您可以使用调试程序在呈现之前检查parameters.LocalVariables
中的内容,并按照您的预期验证它。