กลไกคุณสมบัติของ IronPython สำหรับ ASP.NET สามารถทำให้ไวยากรณ์ของโค้ดบางโค้ดง่ายขึ้น (สำหรับรายละเอียด โปรดดูบทความของฉัน) แต่การสนับสนุนเริ่มต้นดูเหมือนจะไม่สมบูรณ์
ฉันถอดรหัส Microsoft.Web.IronPython.dll และเพิ่มการรองรับการแทรกคุณสมบัติสำหรับ RepeaterItem และเซสชัน (HttpSessionState)
การสนับสนุน RepeaterItem นั้นง่ายมาก เนื่องจากมี ControlAttributesInjector อยู่แล้ว ดังนั้นเพียงเพิ่มบรรทัดของโค้ดลงในตัวสร้างแบบคงที่ของ DynamicLanguageHttpModule.cs:
// itemer
Ops.RegisterAttributesInjectorForType (typeof (RepeaterItem), ControlAttributesInjector ใหม่ (), false);
เซสชันไม่ได้โชคดีนัก คลาสนี้ใช้ ICollection แต่ไม่ได้ใช้อินเทอร์เฟซ IDictionary ดังนั้นฉันจึงใช้ DictionaryAttributesInjector ไม่ได้ ไม่มีทาง ฉันเพิ่มคลาส SessionAttributesInjector ด้วยตัวเอง รหัสจะเป็นดังนี้:
ใช้ IronPython.Runtime;
ใช้ระบบ;
ใช้ System.Collections;
โดยใช้ System.Runtime.InteropServices;
โดยใช้ System.Web.SessionState;
ใช้ System.Diagnostics;
เนมสเปซ Microsoft.Web.IronPython.AttributesInjectors {
// เพิ่มโดยนีลเฉิน
คลาสภายใน SessionAttributesInjector: IAttributesInjector {
รายการ IAttributesInjector.GetAttrNames (วัตถุ obj) {
เซสชัน HttpSessionState = obj เป็น HttpSessionState;
รายการ รายการ = รายการใหม่();
foreach (คีย์สตริงใน session.Keys) {
list.Add(สำคัญ);
-
รายการส่งคืน;
}
บูล IAttributesInjector.TryGetAttr (วัตถุ obj, SymbolId nameSymbol, ค่าวัตถุออก) {
เซสชัน HttpSessionState = obj เป็น HttpSessionState;
ค่า = เซสชั่น [nameSymbol.GetString()];
กลับเป็นจริง;
-
-
}
สิ่งที่แนบมาคือ Microsoft.Web.IronPython.dll ที่แก้ไขแล้วของฉัน
ควรสังเกตว่าแอตทริบิวต์ injector นั้นมีประโยชน์สำหรับการดำเนินการรับเท่านั้น เช่น
name = Session.Name ใช้ได้
แต่การตั้งค่าไม่ใช่:
Session.Name = 'บางชื่อ' จะรายงานข้อผิดพลาด
คุณยังคงต้องใช้ไวยากรณ์นี้:
เซสชัน ["ชื่อ"] = 'ชื่อบางส่วน'