Pregunta

quería probar conseguir NVelocity a codificar automáticamente HTML ciertas cadenas en mi monorraíl aplicación.

Me miró a través del código fuente y NVelocity encontrado EventCartridge, lo que parece ser una clase que puede Plugin para cambiar comportamientos diferentes.

En particular, esta clase tiene un método ReferenceInsert lo que parece hacer exactamente lo que quiero. Básicamente se llama justo antes del valor de referencia (por ejemplo, $ foobar) obtiene la salida, y le permite modificar los resultados.

Lo que no puedo hacer ejercicio es cómo puedo configurar NVelocity / el motor vista monorraíl NVelocity usar mi aplicación?

El Velocity docs velocity.properties sugieren que puede contener una entrada para añadir controladores de eventos específicos como este, pero no puedo encontrar en cualquier parte del código fuente NVelocity que busca esta configuración.

Cualquier ayuda muy apreciada!


Edit: Una prueba simple que muestra este trabajo (! Prueba de concepto por lo que no código de producción)

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
}
¿Fue útil?

Solución

Trate de conectar un nuevo EventCartridge a la VelocityContext. Ver estas pruebas como referencia.

Ahora que ya ha confirmado que este enfoque funciona, heredad de Castle.MonoRail.Framework.Views.NVelocity.NVelocityEngine, BeforeMerge anulación y establecer el EventCartridge y eventos allí. A continuación, configure monorraíl a utilizar este motor vista personalizada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top