Domanda

Ho voluto provare a ottenere NVelocity a automaticamente HTML codificare alcune stringhe nella mia monorotaia app.

ho guardato attraverso il codice sorgente NVelocity e trovato EventCartridge, che sembra essere una classe che è possibile plugin per cambiare vari comportamenti.

In particolare, questa classe ha un metodo ReferenceInsert che sembrerebbe fare esattamente quello che voglio. E 'fondamentalmente viene chiamato poco prima che il valore di un riferimento (ad esempio $ pippo) ottiene in uscita, e consente di modificare i risultati.

Quello che non riesco a capire è come configuro NVelocity / il motore di visualizzazione monorotaia NVelocity usare la mia applicazione?

Il Velocity docs suggeriscono che velocity.properties può contenere un iscrizioni per l'aggiunta di gestori di eventi specifici come questo, ma non riesco a trovare da nessuna parte nel codice sorgente NVelocity che cerca questa configurazione.

Qualsiasi aiuto molto apprezzato!


Edit: Un test semplice che mostra questo lavoro (! Proof of concept, quindi non il codice di produzione)

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
}
È stato utile?

Soluzione

Provare a collegare un nuovo EventCartridge al VelocityContext. Vedere questi test come riferimento.

Ora che hai confermato che questo approccio funziona, ereditare dal Castle.MonoRail.Framework.Views.NVelocity.NVelocityEngine, override BeforeMerge e impostare il EventCartridge e l'evento lì. Quindi configurare monorotaia per utilizzare questo motore visualizzazione personalizzata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top