Automatisch HTML-Codierung NVelocity Output (EventCartridge & ReferenceInsert)
-
30-09-2019 - |
Frage
Ich wollte automatisch versuchen NVelocity bekommen HTML kodieren bestimmte Zeichenfolge in meinem Monorail-App.
Ich sah durch die NVelocity Quellcode und gefunden EventCartridge
, die eine Klasse zu sein scheint, mit dem Sie verschiedene Verhaltensweisen ändern Plugin können.
Insbesondere diese Klasse hat eine ReferenceInsert
Methode, die genau das zu tun scheint, was ich will. Es wird im Grunde nur vor dem Wert einer Referenz (z $ foobar) wird ausgegeben, genannt und ermöglicht es Ihnen, die Ergebnisse zu ändern.
Was ich kann nicht arbeiten, ist, wie ich NVelocity konfigurieren / die Einschiene NVelocity Ansicht Motor meine Implementierung zu benutzen?
Die Geschwindigkeit docs legt nahe, dass velocity.properties einen Eintrag für das Hinzufügen von speziellem Event-Handler wie diese enthalten können, aber ich kann nicht überall in der NVelocity Quellcode, dass sieht für diese Konfiguration.
Jede Hilfe sehr geschätzt!
Edit: Ein einfacher Test, dass zeigt diese Arbeits (! Proof of concept so nicht Produktionscode)
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
}
Lösung
Versuchen Sie einen neuen EventCartridge zum VelocityContext befestigen. Siehe diese Tests als Referenz.
Nun, da Sie, dass dieser Ansatz funktioniert bestätigt haben, vererben Castle.MonoRail.Framework.Views.NVelocity.NVelocityEngine
gekröpft BeforeMerge
und stellen Sie die EventCartridge
und Ereignis gibt. Dann Monorail konfiguriert, um diese benutzerdefinierte Ansicht Engine verwenden.