2 // System.Web.UI.TemplateControl.cs
5 // Duncan Mak (duncan@ximian.com)
6 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // Andreas Nahr (ClassDevelopment@A-SoftTech.com)
9 // (C) 2002 Ximian, Inc. (http://www.ximian.com)
10 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections;
33 using System.ComponentModel;
34 using System.Reflection;
35 using System.Security.Permissions;
36 using System.Web.Compilation;
37 using System.Web.Util;
40 namespace System.Web.UI {
43 [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
44 [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
46 public abstract class TemplateControl : Control, INamingContainer, IFilterResolutionService {
48 public abstract class TemplateControl : Control, INamingContainer {
50 static readonly Assembly _System_Web_Assembly = typeof (TemplateControl).Assembly;
51 static object abortTransaction = new object ();
52 static object commitTransaction = new object ();
53 static object error = new object ();
54 static string [] methodNames = { "Page_Init",
59 "Page_PreRenderComplete",
60 "Page_SaveStateComplete",
69 "Page_AbortTransaction",
70 "Page_CommitTransaction"};
72 const BindingFlags bflags = BindingFlags.Public |
73 BindingFlags.NonPublic |
74 BindingFlags.Instance;
77 string _appRelativeVirtualPath;
81 protected TemplateControl ()
89 [EditorBrowsable (EditorBrowsableState.Never)]
93 protected virtual int AutoHandlers {
98 [EditorBrowsable (EditorBrowsableState.Never)]
99 protected virtual bool SupportAutoEvents {
104 public string AppRelativeVirtualPath {
105 get { return _appRelativeVirtualPath; }
106 set { _appRelativeVirtualPath = value; }
114 protected virtual void Construct ()
118 [MonoTODO ("Not implemented")]
119 protected LiteralControl CreateResourceBasedLiteralControl (int offset,
126 internal void WireupAutomaticEvents ()
128 if (!SupportAutoEvents || !AutoEventWireup)
131 foreach (string methodName in methodNames) {
132 MethodInfo method = null;
134 for (type = GetType (); type.Assembly != _System_Web_Assembly; type = type.BaseType) {
135 method = type.GetMethod (methodName, bflags);
142 if (method.DeclaringType != type) {
143 if (!method.IsPublic && !method.IsFamilyOrAssembly &&
144 !method.IsFamilyAndAssembly && !method.IsFamily)
148 if (method.ReturnType != typeof (void))
151 ParameterInfo [] parms = method.GetParameters ();
152 int length = parms.Length;
153 bool noParams = (length == 0);
154 if (!noParams && (length != 2 ||
155 parms [0].ParameterType != typeof (object) ||
156 parms [1].ParameterType != typeof (EventArgs)))
159 int pos = methodName.IndexOf ("_");
160 string eventName = methodName.Substring (pos + 1);
161 EventInfo evt = type.GetEvent (eventName);
163 /* This should never happen */
168 NoParamsInvoker npi = new NoParamsInvoker (this, method);
169 evt.AddEventHandler (this, npi.FakeDelegate);
171 evt.AddEventHandler (this, Delegate.CreateDelegate (
173 typeof (EventHandler), this, method));
175 typeof (EventHandler), this, methodName));
181 [EditorBrowsable (EditorBrowsableState.Never)]
182 protected virtual void FrameworkInitialize ()
186 Type GetTypeFromControlPath (string virtualPath)
188 if (virtualPath == null)
189 throw new ArgumentNullException ("virtualPath");
191 string vpath = UrlUtils.Combine (TemplateSourceDirectory, virtualPath);
192 string realpath = Context.Request.MapPath (vpath);
193 return UserControlParser.GetCompiledType (vpath, realpath, Context);
196 public Control LoadControl (string virtualPath)
199 if (virtualPath == null)
200 throw new ArgumentNullException ("virtualPath");
202 if (virtualPath == null)
203 throw new HttpException ("virtualPath is null");
205 Type type = GetTypeFromControlPath (virtualPath);
206 return LoadControl (type, null);
209 public Control LoadControl (Type type, object[] parameters)
211 object [] attrs = type.GetCustomAttributes (typeof (PartialCachingAttribute), true);
212 if (attrs != null && attrs.Length == 1) {
213 PartialCachingAttribute attr = (PartialCachingAttribute) attrs [0];
214 PartialCachingControl ctrl = new PartialCachingControl (type, parameters);
215 ctrl.VaryByParams = attr.VaryByParams;
216 ctrl.VaryByControls = attr.VaryByControls;
217 ctrl.VaryByCustom = attr.VaryByCustom;
221 object control = Activator.CreateInstance (type, parameters);
222 if (control is UserControl)
223 ((UserControl) control).InitializeAsUserControl (Page);
225 return (Control) control;
228 public ITemplate LoadTemplate (string virtualPath)
231 if (virtualPath == null)
232 throw new ArgumentNullException ("virtualPath");
234 if (virtualPath == null)
235 throw new HttpException ("virtualPath is null");
237 Type t = GetTypeFromControlPath (virtualPath);
238 return new SimpleTemplate (t);
241 protected virtual void OnAbortTransaction (EventArgs e)
243 EventHandler eh = Events [abortTransaction] as EventHandler;
248 protected virtual void OnCommitTransaction (EventArgs e)
250 EventHandler eh = Events [commitTransaction] as EventHandler;
255 protected virtual void OnError (EventArgs e)
257 EventHandler eh = Events [error] as EventHandler;
262 [MonoTODO ("Not implemented, always returns null")]
263 public Control ParseControl (string content)
266 throw new ArgumentNullException ("content");
271 [EditorBrowsable (EditorBrowsableState.Never)]
276 object ReadStringResource ()
278 throw new NotSupportedException ();
282 protected object GetGlobalResourceObject (string className, string resourceKey)
284 return HttpContext.GetGlobalResourceObject (className, resourceKey);
287 [MonoTODO ("Not implemented")]
288 protected object GetGlobalResourceObject (string className, string resourceKey, Type objType, string propName)
290 // FIXME: not sure how to implement that one yet
291 throw new NotSupportedException();
294 protected object GetLocalResourceObject (string resourceKey)
296 return HttpContext.GetLocalResourceObject (VirtualPathUtility.ToAbsolute (this.AppRelativeVirtualPath),
300 protected object GetLocalResourceObject (string resourceKey, Type objType, string propName)
302 // FIXME: not sure how to implement that one yet
303 throw new NotSupportedException();
307 [EditorBrowsable (EditorBrowsableState.Never)]
308 public static object ReadStringResource (Type t)
310 throw new NotSupportedException ();
313 [MonoTODO ("Not implemented, does nothing")]
314 [EditorBrowsable (EditorBrowsableState.Never)]
315 protected void SetStringResourcePointer (object stringResourcePointer,
316 int maxResourceOffset)
320 [MonoTODO ("Not implemented, does nothing")]
321 [EditorBrowsable (EditorBrowsableState.Never)]
322 protected void WriteUTF8ResourceString (HtmlTextWriter output, int offset,
323 int size, bool fAsciiOnly)
331 [WebSysDescription ("Raised when the user aborts a transaction.")]
332 public event EventHandler AbortTransaction {
333 add { Events.AddHandler (abortTransaction, value); }
334 remove { Events.RemoveHandler (abortTransaction, value); }
337 [WebSysDescription ("Raised when the user initiates a transaction.")]
338 public event EventHandler CommitTransaction {
339 add { Events.AddHandler (commitTransaction, value); }
340 remove { Events.RemoveHandler (commitTransaction, value); }
343 [WebSysDescription ("Raised when an exception occurs that cannot be handled.")]
344 public event EventHandler Error {
345 add { Events.AddHandler (error, value); }
346 remove { Events.RemoveHandler (error, value); }
351 class SimpleTemplate : ITemplate
355 public SimpleTemplate (Type type)
360 public void InstantiateIn (Control control)
362 Control template = Activator.CreateInstance (type) as Control;
363 template.SetBindingContainer (false);
364 control.Controls.Add (template);
369 protected internal object Eval (string expression)
371 return DataBinder.Eval (Page.GetDataItem(), expression);
374 protected internal string Eval (string expression, string format)
376 return DataBinder.Eval (Page.GetDataItem(), expression, format);
379 protected internal object XPath (string xpathexpression)
381 return XPathBinder.Eval (Page.GetDataItem(), xpathexpression);
384 protected internal object XPath (string xpathexpression, IXmlNamespaceResolver resolver)
386 return XPathBinder.Eval (Page.GetDataItem (), xpathexpression, null, resolver);
389 protected internal string XPath (string xpathexpression, string format)
391 return XPathBinder.Eval (Page.GetDataItem(), xpathexpression, format);
394 protected internal string XPath (string xpathexpression, string format, IXmlNamespaceResolver resolver)
396 return XPathBinder.Eval (Page.GetDataItem (), xpathexpression, format, resolver);
399 protected internal IEnumerable XPathSelect (string xpathexpression)
401 return XPathBinder.Select (Page.GetDataItem(), xpathexpression);
404 protected internal IEnumerable XPathSelect (string xpathexpression, IXmlNamespaceResolver resolver)
406 return XPathBinder.Select (Page.GetDataItem (), xpathexpression, resolver);
409 // IFilterResolutionService
411 [MonoTODO ("Not implemented")]
412 int IFilterResolutionService.CompareFilters (string filter1, string filter2)
414 throw new NotImplementedException ();
417 [MonoTODO ("Not implemented")]
418 bool IFilterResolutionService.EvaluateFilter (string filterName)
420 throw new NotImplementedException ();