Le mécanisme d'injection de propriétés d'IronPython pour ASP.NET peut simplifier la syntaxe de certains codes (pour plus de détails, veuillez vous référer à mon article), mais la prise en charge par défaut semble encore incomplète.
J'ai décompilé Microsoft.Web.IronPython.dll et ajouté la prise en charge de l'injection de propriétés pour RepeaterItem et Session (HttpSessionState).
La prise en charge de RepeaterItem est très simple, car il possède déjà ControlAttributesInjector. Il suffit donc d'ajouter une ligne de code au constructeur statique de DynamicLanguageHttpModule.cs :
// élément répéteur.
Ops.RegisterAttributesInjectorForType(typeof(RepeaterItem), new ControlAttributesInjector(), false);
La session n'a pas cette chance. Cette classe implémente ICollection, mais n'implémente pas l'interface IDictionary. Je ne peux donc pas utiliser DictionaryAttributesInjector. Pas question, j'ai moi-même ajouté une classe SessionAttributesInjector. Le code est le suivant :
using IronPython.Runtime ;
utiliser le système ;
en utilisant System.Collections ;
en utilisant System.Runtime.InteropServices ;
en utilisant System.Web.SessionState ;
en utilisant System.Diagnostics ;
espace de noms Microsoft.Web.IronPython.AttributesInjectors {
// ajouté par Neil Chen.
classe interne SessionAttributesInjector : IAttributesInjector {
Liste IAttributesInjector.GetAttrNames (objet obj) {
Session HttpSessionState = obj comme HttpSessionState ;
Liste liste = new List();
foreach (clé de chaîne dans session.Keys) {
list.Add(clé);
}
liste de retour ;
}
bool IAttributesInjector.TryGetAttr (objet obj, SymbolId nameSymbol, valeur de l'objet) {
Session HttpSessionState = obj comme HttpSessionState ;
valeur = session[nameSymbol.GetString()];
renvoie vrai ;
}
}
}
Ci-joint mon Microsoft.Web.IronPython.dll modifié.
Il convient de noter que l'injecteur d'attribut n'est utile que pour les opérations d'obtention, telles que.
name = Session.Name est OK,
mais le paramètre ne l'est pas :
Session.Name = 'some name' signalera une erreur.
Vous devez toujours utiliser cette syntaxe :
Session["Nom"] = 'un nom'