2014-10-07 9 views
0

현재 프로젝트를 진행 중이고 템플릿 자체에서 Enum을 사용해야하는 경우가 있습니다. DotLiquid 템플릿 내에서 열거 형에 액세스 할 수 있도록 다음 클래스를 만들었습니다.SafeType의 블록이 작동하지 않는 경우

/// <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 Container에 의해 호출되며 "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}}가 그 시점에서 문자열로 해석 될지라도, 그렇진 않습니다. 열거 자체 만 갖기 위해 지역화를 제거했지만 동작은 동일합니다 (열거 형이 더 이상 현지화되지 않음). 이 경우 평등을 테스트하기 위해 새로운 블록을 만드는 것을 피하고 싶습니다. 나는 온라인으로 수색했지만 아무 대답도없는 것 같다. https://groups.google.com/forum/#!topic/dotliquid/hU4hnOYjCnY

답변

1

이 문제는 MapVariables에있을 수 있습니다 :

는 또한 공식 포럼에 질문을 게시

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

내가 가진 키를 추가 생각하지 않는 "." 그것은 예상대로 작동합니다 (예외가 발생해야 함). 또한 member은 정수가 아니므로 keyPaymentMethod.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에 입력하고 예상대로 작동하는지 확인하십시오.