如果SafeTypes上的块不起作用

本文关键字:不起作用 SafeTypes 如果 | 更新日期: 2023-09-27 18:25:55

我目前正在处理一个项目,我们有某些需求,需要在模板中使用枚举。我创建了以下类,允许我访问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/dotlique/hU4hnOYjCny

如果SafeTypes上的块不起作用

问题可能在MapVariables:中

var key = String.Format("{0}.{1}", enumType.Name, member);
parameters.LocalVariables.Add(key, LocalizeEnum(member));

我不认为添加一个带有"."的键会像你预期的那样起作用(它可能会抛出一个异常)。另外,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中的内容,并验证它是否如您所期望的那样。