// Authors:
// Jackson Harper (jackson@ximian.com)
//
-// (C) 2005 Novell, Inc.
+// (C) 2005-2010 Novell, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
using System.ComponentModel;
using System.Globalization;
+using System.Reflection;
using System.Security.Permissions;
+using System.Web.Util;
namespace System.Web.UI.HtmlControls {
[AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
// attributes
[DefaultEventAttribute ("ServerClick")]
-#if NET_2_0
[SupportsEventValidation]
-#endif
- public class HtmlInputButton : HtmlInputControl, IPostBackEventHandler {
-
- private static readonly object ServerClickEvent = new object();
+ public class HtmlInputButton : HtmlInputControl, IPostBackEventHandler
+ {
+ static readonly object ServerClickEvent = new object();
public HtmlInputButton () : this ("button")
{
[DefaultValue(true)]
[WebSysDescription("")]
[WebCategory("Behavior")]
-#if NET_2_0
- public virtual
-#else
- public
-#endif
- bool CausesValidation {
+ public virtual bool CausesValidation {
get {
string flag = Attributes["CausesValidation"];
}
}
-#if NET_2_0
[DefaultValue ("")]
public virtual string ValidationGroup
{
Attributes["ValidationGroup"] = value;
}
}
-#endif
void RaisePostBackEventInternal (string eventArgument)
{
+ ValidateEvent (UniqueID, eventArgument);
if (CausesValidation)
-#if NET_2_0
Page.Validate (ValidationGroup);
-#else
- Page.Validate ();
-#endif
- OnServerClick (EventArgs.Empty);
+
+ if (String.Compare (Type, "reset", true, Helpers.InvariantCulture) != 0)
+ OnServerClick (EventArgs.Empty);
+ else
+ ResetForm (FindForm ());
+ }
+
+ HtmlForm FindForm ()
+ {
+ Page p = Page;
+ if (p != null)
+ return p.Form;
+
+ return null;
+ }
+
+ void ResetForm (HtmlForm form)
+ {
+ if (form == null || !form.HasControls ())
+ return;
+
+ ResetChildrenValues (form.Controls);
+ }
+
+ void ResetChildrenValues (ControlCollection children)
+ {
+ foreach (Control child in children) {
+ if (child == null)
+ continue;
+
+ if (child.HasControls ())
+ ResetChildrenValues (child.Controls);
+ ResetChildValue (child);
+ }
+ }
+
+ void ResetChildValue (Control child)
+ {
+ Type type = child.GetType ();
+ object[] attributes = type.GetCustomAttributes (false);
+ if (attributes == null || attributes.Length == 0)
+ return;
+
+ string defaultProperty = null;
+ DefaultPropertyAttribute defprop;
+
+ foreach (object attr in attributes) {
+ defprop = attr as DefaultPropertyAttribute;
+ if (defprop == null)
+ continue;
+ defaultProperty = defprop.Name;
+ break;
+ }
+
+ if (defaultProperty == null || defaultProperty.Length == 0)
+ return;
+
+ PropertyInfo pi = null;
+ try {
+ pi = type.GetProperty (defaultProperty,
+ BindingFlags.Instance |
+ BindingFlags.Public |
+ BindingFlags.Static |
+ BindingFlags.IgnoreCase);
+ } catch (Exception) {
+ // ignore
+ }
+ if (pi == null || !pi.CanWrite)
+ return;
+
+ attributes = pi.GetCustomAttributes (false);
+ if (attributes == null || attributes.Length == 0)
+ return;
+
+ DefaultValueAttribute defval = null;
+ object value = null;
+
+ foreach (object attr in attributes) {
+ defval = attr as DefaultValueAttribute;
+ if (defval == null)
+ continue;
+ value = defval.Value;
+ break;
+ }
+
+ if (value == null || pi.PropertyType != value.GetType ())
+ return;
+
+ try {
+ pi.SetValue (child, value, null);
+ } catch (Exception) {
+ // ignore
+ }
}
-#if NET_2_0
protected virtual void RaisePostBackEvent (string eventArgument)
{
RaisePostBackEventInternal (eventArgument);
}
-#endif
void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
{
-#if NET_2_0
RaisePostBackEvent (eventArgument);
-#else
- RaisePostBackEventInternal (eventArgument);
-#endif
}
-#if NET_2_0
- protected internal
-#else
- protected
-#endif
- override void OnPreRender (EventArgs e)
+ protected internal override void OnPreRender (EventArgs e)
{
base.OnPreRender (e);
if (Events [ServerClickEvent] != null)
server_click (this, e);
}
-#if !NET_2_0
- bool RenderOnClick ()
- {
- if (Page == null || !CausesValidation)
- return false;
-
- CultureInfo inv = CultureInfo.InvariantCulture;
- string input_type = Type;
- if (0 == String.Compare (input_type, "submit", true, inv) &&
- Page.Validators.Count > 0)
- return true;
-
- if (0 == String.Compare (input_type, "button", true, inv) &&
- Events [ServerClickEvent] != null)
- return true;
-
- return false;
- }
-#endif
-
protected override void RenderAttributes (HtmlTextWriter writer)
{
-#if NET_2_0
- CultureInfo inv = CultureInfo.InvariantCulture;
+ CultureInfo inv = Helpers.InvariantCulture;
string input_type = Type;
if (0 != String.Compare (input_type, "reset", true, inv) &&
((0 == String.Compare (input_type, "submit", true, inv)) ||
onclick = ClientScriptManager.EnsureEndsWithSemicolon (Attributes ["onclick"] + onclick);
Attributes.Remove ("onclick");
}
- if (Page != null) {
+
+ Page page = Page;
+ if (page != null) {
PostBackOptions options = GetPostBackOptions ();
- onclick += Page.ClientScript.GetPostBackEventReference (options);
+ onclick += page.ClientScript.GetPostBackEventReference (options, true);
}
if (onclick.Length > 0) {
- writer.WriteAttribute ("onclick", onclick);
- writer.WriteAttribute ("language", "javascript");
- }
- }
-#else
- if (RenderOnClick ()) {
- string oc = null;
- ClientScriptManager csm = new ClientScriptManager (Page);
- if (Page.AreValidatorsUplevel ()) {
- oc = csm.GetClientValidationEvent ();
- } else if (Events [ServerClickEvent] != null) {
- oc = Attributes ["onclick"] + " " + csm.GetPostBackEventReference (this, "");
- }
-
- if (oc != null) {
+ bool encode = true;
+ if (Events [ServerClickEvent] != null)
+ encode = false; // tests show that this is indeed
+ // the case...
+ writer.WriteAttribute ("onclick", onclick, encode);
writer.WriteAttribute ("language", "javascript");
- writer.WriteAttribute ("onclick", oc);
}
}
-#endif
Attributes.Remove ("CausesValidation");
-#if NET_2_0
// LAMESPEC: MS doesn't actually remove this
//attribute. it shows up in the rendered
//output.
// Attributes.Remove("ValidationGroup");
-#endif
base.RenderAttributes (writer);
}
-#if NET_2_0
- PostBackOptions GetPostBackOptions () {
+ PostBackOptions GetPostBackOptions ()
+ {
+ Page page = Page;
PostBackOptions options = new PostBackOptions (this);
options.ValidationGroup = null;
options.ActionUrl = null;
- options.Argument = "";
+ options.Argument = String.Empty;
options.RequiresJavaScriptProtocol = false;
- options.ClientSubmit = (0 != String.Compare (Type, "submit", true, CultureInfo.InvariantCulture));
- options.PerformValidation = CausesValidation && Page != null && Page.Validators.Count > 0;
+ options.ClientSubmit = (0 != String.Compare (Type, "submit", true, Helpers.InvariantCulture));
+ options.PerformValidation = CausesValidation && page != null && page.Validators.Count > 0;
if (options.PerformValidation)
options.ValidationGroup = ValidationGroup;
return options;
}
-#endif
[WebSysDescription("")]
[WebCategory("Action")]
add { Events.AddHandler (ServerClickEvent, value); }
remove { Events.RemoveHandler (ServerClickEvent, value); }
}
- }
-
+ }
}