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> &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
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top