diff --git a/src/Spring/Spring.Core/Spring.Core.2008.csproj b/src/Spring/Spring.Core/Spring.Core.2008.csproj
index 90ca7dc4..f83cc10a 100644
--- a/src/Spring/Spring.Core/Spring.Core.2008.csproj
+++ b/src/Spring/Spring.Core/Spring.Core.2008.csproj
@@ -602,7 +602,6 @@
-
diff --git a/src/Spring/Spring.Web/Web/Support/InterceptControlCollectionOwnerStrategy.cs b/src/Spring/Spring.Web/Web/Support/InterceptControlCollectionOwnerStrategy.cs
index 52634965..42daefae 100644
--- a/src/Spring/Spring.Web/Web/Support/InterceptControlCollectionOwnerStrategy.cs
+++ b/src/Spring/Spring.Web/Web/Support/InterceptControlCollectionOwnerStrategy.cs
@@ -18,6 +18,7 @@
#region Imports
+using System.Web.UI;
using Spring.Context;
#endregion
@@ -33,7 +34,10 @@ namespace Spring.Web.Support
public bool Intercept(IApplicationContext defaultApplicationContext, ControlAccessor ctlAccessor,
ControlCollectionAccessor ctlColAccessor)
{
- ctlColAccessor.Owner = new SupportsWebDependencyInjectionOwnerProxy(defaultApplicationContext, ctlAccessor.GetTarget() );
+ Control target = ctlAccessor.GetTarget();
+ ctlColAccessor.Owner = target is INamingContainer
+ ? new NamingContainerSupportsWebDependencyInjectionOwnerProxy(defaultApplicationContext, target)
+ : new SupportsWebDependencyInjectionOwnerProxy(defaultApplicationContext, target);
return true;
}
}
diff --git a/src/Spring/Spring.Web/Web/Support/SupportsWebDependencyInjectionOwnerProxy.cs b/src/Spring/Spring.Web/Web/Support/SupportsWebDependencyInjectionOwnerProxy.cs
index 6a22b860..937215d1 100644
--- a/src/Spring/Spring.Web/Web/Support/SupportsWebDependencyInjectionOwnerProxy.cs
+++ b/src/Spring/Spring.Web/Web/Support/SupportsWebDependencyInjectionOwnerProxy.cs
@@ -18,9 +18,11 @@
#region Imports
+using System.Reflection;
using System.Web.UI;
using Spring.Context;
using Spring.Context.Support;
+using Spring.Reflection.Dynamic;
using Spring.Web.Support;
#endregion
@@ -28,7 +30,7 @@ using Spring.Web.Support;
namespace Spring.Web.Support
{
///
- /// Wraps a Control to make it DI aware
+ /// Wraps a ControlCollection.Owner control to make it DI aware
///
/// Erich Eichinger
internal class SupportsWebDependencyInjectionOwnerProxy : Control, ISupportsWebDependencyInjection
@@ -79,4 +81,24 @@ namespace Spring.Web.Support
_targetControl.RemovedControl(control);
}
}
+
+ ///
+ /// Wraps a ControlCollection.Owner control implementing INamingContainer to make it DI aware
+ ///
+ /// Erich Eichinger
+ internal class NamingContainerSupportsWebDependencyInjectionOwnerProxy : SupportsWebDependencyInjectionOwnerProxy
+ , INamingContainer
+ {
+#if NET_2_0
+ private static readonly SafeField refOccasionalFields = new SafeField(typeof(Control).GetField("_occasionalFields", BindingFlags.Instance|BindingFlags.NonPublic));
+#endif
+
+ public NamingContainerSupportsWebDependencyInjectionOwnerProxy(IApplicationContext defaultApplicationContext, Control targetControl) : base(defaultApplicationContext, targetControl)
+ {
+#if NET_2_0
+ object targetOccasionalFields = refOccasionalFields.GetValue(targetControl);
+ refOccasionalFields.SetValue(this, targetOccasionalFields);
+#endif
+ }
+ }
}