HTML automatiquement l'encodage NVelocity sortie (EventCartridge & ReferenceInsert)
-
30-09-2019 - |
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> <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
}
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.