Der Eigenschaftsinjektormechanismus von IronPython für ASP.NET kann die Syntax einiger Codes vereinfachen (weitere Informationen finden Sie in meinem Artikel), aber die Standardunterstützung scheint noch unvollständig zu sein.
Ich habe Microsoft.Web.IronPython.dll dekompiliert und Property-Injection-Unterstützung für RepeaterItem und Session (HttpSessionState) hinzugefügt.
Die Unterstützung für RepeaterItem ist sehr einfach, da es bereits über ControlAttributesInjector verfügt. Fügen Sie also einfach eine Codezeile zum statischen Konstruktor von DynamicLanguageHttpModule.cs hinzu:
// Repeater-Element
Ops.RegisterAttributesInjectorForType(typeof(RepeaterItem), new ControlAttributesInjector(), false);
Session hat nicht so viel Glück. Diese Klasse implementiert ICollection, implementiert jedoch nicht die IDictionary-Schnittstelle. Daher kann ich DictionaryAttributesInjector nicht verwenden. Ich habe selbst eine SessionAttributesInjector-Klasse hinzugefügt. Der Code lautet wie folgt:
using IronPython.Runtime;
Verwenden des Systems;
Verwenden von System.Collections;
Verwenden von System.Runtime.InteropServices;
using System.Web.SessionState;
using System.Diagnostics;
Namespace Microsoft.Web.IronPython.AttributesInjectors {
// hinzugefügt von Neil Chen.
interne Klasse SessionAttributesInjector: IAttributesInjector {
Liste IAttributesInjector.GetAttrNames(object obj) {
HttpSessionState session = obj as HttpSessionState;
Liste list = new List();
foreach (String-Schlüssel in session.Keys) {
list.Add(key);
}
Rückgabeliste;
}
bool IAttributesInjector.TryGetAttr(object obj, SymbolId nameSymbol, out object value) {
HttpSessionState session = obj as HttpSessionState;
value = session[nameSymbol.GetString()];
return true;
}
}
}
Im Anhang ist meine geänderte Microsoft.Web.IronPython.dll.
Es ist zu beachten, dass der Attributinjektor nur für Get-Vorgänge nützlich ist, z
name = Session.Name ist in Ordnung,
aber die Einstellung ist nicht:
Session.Name = 'some name' meldet einen Fehler.
Sie müssen weiterhin diese Syntax verwenden:
Session["Name"] = 'irgendein Name'