Автоматически HTML кодирование NVELOCITY выход (EventCartridge & Weartsert)
-
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> <p>This "should" be 'encoded'</p>", 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("&", "&")
.Replace("<", "<")
.Replace(">", ">")
.Replace("\"", """)
.Replace("'", "'"); // ' does not work in IE
}
Решение
Попробуйте прикрепить новый EventCardridge к VelocityContext. Видеть Эти тесты в качестве ссылки.
Теперь, когда вы подтвердили, что этот подход работает, наследует от Castle.MonoRail.Framework.Views.NVelocity.NVelocityEngine
, переопределить BeforeMerge
и установить EventCartridge
и событие там. Затем настройте монорелью, чтобы использовать этот пользовательский моторный двигатель.