Question

Je voulais essayer d'obtenir automatiquement NVelocity à HTML encoder certaines chaînes dans mon application monorail.

je regardais à travers le code source NVelocity et trouvé EventCartridge, ce qui semble être une classe que vous pouvez plugin changer divers comportements.

cette classe a en particulier une méthode ReferenceInsert qui semble faire exactement ce que je veux. Il se fond appelée juste avant que la valeur d'une référence (par exemple foobar $) obtient la sortie, et vous permet de modifier les résultats.

Ce que je ne peux pas travailler est de savoir comment configurer NVelocity / moteur vue monorail NVelocity utiliser ma mise en œuvre?

Le Velocity docs suggèrent que velocity.properties peut contenir une entrée pour ajouter des gestionnaires d'événements spécifiques comme celui-ci, mais je ne trouve nulle part dans le code source NVelocity qui recherche cette configuration.

Toute aide grandement appréciée!


Edit: Un test simple qui montre ce travail (! De la preuve de concept afin de ne pas de code de production)

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
}
Était-ce utile?

La solution

Essayez de fixer un nouveau EventCartridge à la VelocityContext. Voir ces tests comme référence.

Maintenant que vous avez confirmé que cette approche fonctionne, Hériter de Castle.MonoRail.Framework.Views.NVelocity.NVelocityEngine, override BeforeMerge et régler le EventCartridge et l'événement là-bas. Ensuite, configurez monorail pour utiliser ce moteur de vue personnalisée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top