nVelocity - проблема с шаблоном при попытке сравнить больше, чем десятичное свойство - PullRequest
1 голос
/ 24 марта 2010

У меня есть простой объект, один из свойств которого имеет десятичное число с именем Amount. Когда я пытаюсь сравнить это свойство как часть шаблона nVelocity, сравнение всегда заканчивается неудачей. Если я изменяю свойство типа int, сравнение работает нормально. Что-нибудь еще нужно добавить в шаблон для сравнения для работы?

Ниже приведен образец из вышеупомянутого шаблона:

#foreach( $bet in $bets )
<li>
 $bet.Date $bet.Race 
 #if($bet.Amount > 10)
  <strong>$bet.Amount.ToString("c")</strong>
 #else
  $bet.Amount.ToString("c")
 #end
</li>
#end

Ниже приведен класс ставок:

public class Bet
{
    public Bet(decimal amount, string race, DateTime date)
    {
       Amount = amount;
       Race = race;
       Date = date;
    }

    public decimal Amount { get; set; }
    public string Race { get; set; }
    public DateTime Date { get; set; }
}

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

Я проверял это, и оно работало . Похоже, что это была ошибка, которой больше нет в последней версии NVelocity (1.1 на момент написания этой статьи).

0 голосов
/ 25 марта 2010

Конечно.

Полный шаблон nVelocity:

<div>
Bet summary:

<ul>
#foreach( $bet in $bets )
<li>
    $bet.Date $bet.Race 
    #if($bet.Amount > 10)
        <strong>$bet.Amount.ToString("c")</strong>
    #else
        $bet.Amount.ToString("c")
    #end
</li>
#end
</ul>

</div> 

Класс ставки:

public class Bet
{
    public Bet(decimal amount, string race, DateTime date)
    {
       Amount = amount;
       Race = race;
       Date = date;
    }

    public decimal Amount { get; set; }
    public string Race { get; set; }
    public DateTime Date { get; set; }
}

Программа:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Commons.Collections;
using NVelocity.App;
using NVelocity;
using NVelocity.Runtime;

namespace nVelocityTest
{
    public class Program
    {
        private static void Init()
        {
            var props = new ExtendedProperties();
            props.AddProperty(RuntimeConstants_Fields.FILE_RESOURCE_LOADER_PATH, @"C:\dev\RnD\nVelocity\nVelocityTest\nVelocityTest\EmailTemplates");
            Velocity.Init(props);
        }

        static void Main()
        {
            Init();

            ICollection<Bet> bet = new Collection<Bet> { new Bet(10, "Banana Race", DateTime.Now), new Bet(15, "Potatoe Race", DateTime.Now) };

            GenerateBetSummaryEmail(bet);
        }

        private static void GenerateBetSummaryEmail(ICollection<Bet> bets)
        {
            var context = new VelocityContext();
            context.Put("bets", bets);

            var writer = new System.IO.StringWriter();

            try
            {
                Velocity.MergeTemplate("BetConfirmationEmailTemplate.vm", context, writer);
            }
            catch (Exception e)
            {
                Console.WriteLine("Problem merging template : " + e);
            }

            var outputTest = writer.GetStringBuilder().ToString();
        } 
    }
}

Ожидаемый выходной тест:

Ниже приведена сводка вашей ставки:
  • 25.03.2010 9:21:15 Banana Race $ 10.00
  • 25/03/2010 9:21:15 утра Картофельная гонка 15,00 $

Фактический выходной тест:

Ниже приведена сводка вашей ставки:
  • 25.03.2010 9:21:15 Banana Race $ 10.00
  • 25/03/2010 9:21:15 утра Картофельная гонка 15,00 $

Как упоминалось ранее, сравнение #if ($ bet.Amount> 10) в шаблоне nVelocity завершается неудачно, хотя во втором объекте ставки значение bet.Amount равно 15. Если значение Amount изменено на тип int, сравнение работает как положено.

...