Автоматически HTML кодирование NVELOCITY выход (EventCartridge & Weartsert)

StackOverflow https://stackoverflow.com/questions/4346765

  •  30-09-2019
  •  | 
  •  

Вопрос

Я хотел попытаться получить NVelocity автоматически HTML кодировать определенные строки в моем приложении Monorail.

Я просматривал исходный код NVelocity и нашел EventCartridge, Кажется, что это класс, который вы можете плагин, чтобы изменить различные поведения.

В частности, этот класс имеет ReferenceInsert Метод, который, кажется, сделает именно то, что я хочу. Он в основном вызывается непосредственно перед значением ссылки (например, $ FOOBAR), получает вывод и позволяет изменять результаты.

То, что я не могу отработать, это то, как я настрою NVelocity / Monorail Nwvelocity View Engine для использования моей реализации?

То Документы скоростей Предложите, что Velocity.Properties может содержать записи для добавления конкретных обработчиков событий, таких как это, но я не могу найти нигде в исходном коде Nvelocity, который ищет эту конфигурацию.

Любая помощь значительно ценится!


Редактировать: простой тест, который показывает эту работу (доказательство концепции, так что не производственный код!)

private VelocityEngine _velocityEngine;
private VelocityContext _velocityContext;

[SetUp]
public void Setup()
{
    _velocityEngine = new VelocityEngine();
    _velocityEngine.Init();

    // creates the context...
    _velocityContext = new VelocityContext();

    // attach a new event cartridge
    _velocityContext.AttachEventCartridge(new EventCartridge());

    // add our custom handler to the ReferenceInsertion event
    _velocityContext.EventCartridge.ReferenceInsertion += EventCartridge_ReferenceInsertion;
}

[Test]
public void EncodeReference()
{
    _velocityContext.Put("thisShouldBeEncoded", "<p>This \"should\" be 'encoded'</p>");

    var writer = new StringWriter();

    var result = _velocityEngine.Evaluate(_velocityContext, writer, "HtmlEncodingEventCartridgeTestFixture.EncodeReference", @"<p>This ""shouldn't"" be encoded.</p> $thisShouldBeEncoded");

    Assert.IsTrue(result, "Evaluation returned failure");
    Assert.AreEqual(@"<p>This ""shouldn't"" be encoded.</p> &lt;p&gt;This &quot;should&quot; be &#39;encoded&#39;&lt;/p&gt;", writer.ToString());
}

private static void EventCartridge_ReferenceInsertion(object sender, ReferenceInsertionEventArgs e)
{
    var originalString = e.OriginalValue as string;

    if (originalString == null) return;

    e.NewValue = HtmlEncode(originalString);
}

private static string HtmlEncode(string value)
{
    return value
        .Replace("&", "&amp;")
        .Replace("<", "&lt;")
        .Replace(">", "&gt;")
        .Replace("\"", "&quot;")
        .Replace("'", "&#39;"); // &apos; does not work in IE
}
Это было полезно?

Решение

Попробуйте прикрепить новый EventCardridge к VelocityContext. Видеть Эти тесты в качестве ссылки.

Теперь, когда вы подтвердили, что этот подход работает, наследует от Castle.MonoRail.Framework.Views.NVelocity.NVelocityEngine, переопределить BeforeMerge и установить EventCartridge и событие там. Затем настройте монорелью, чтобы использовать этот пользовательский моторный двигатель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top