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 + } + } }