2 // System.Web.UI.HtmlControls.HtmlAnchor.cs
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // Copyright (C) 2005-2010 Novell, Inc (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System.ComponentModel;
30 using System.Security.Permissions;
32 namespace System.Web.UI.HtmlControls {
35 [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
36 [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
38 [DefaultEvent ("ServerClick")]
39 [SupportsEventValidation]
40 public class HtmlAnchor : HtmlContainerControl, IPostBackEventHandler
42 static readonly object serverClickEvent = new object ();
50 [WebSysDescription("")]
51 [WebCategory("Action")]
52 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
56 string s = Attributes ["href"];
57 return (s == null) ? String.Empty : s;
60 if (value == null || value.Length == 0) {
61 Attributes.Remove ("href");
63 Attributes ["href"] = value;
69 [WebSysDescription("")]
70 [WebCategory("Navigation")]
71 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
74 string s = Attributes ["name"];
75 return (s == null) ? String.Empty : s;
78 if (value == null || value.Length == 0)
79 Attributes.Remove ("name");
81 Attributes ["name"] = value;
86 [WebSysDescription("")]
87 [WebCategory("Navigation")]
88 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
89 public string Target {
91 string s = Attributes ["target"];
92 return (s == null) ? String.Empty : s;
95 if (value == null || value.Length == 0)
96 Attributes.Remove ("target");
98 Attributes ["target"] = value;
103 [WebSysDescription("")]
104 [WebCategory("Appearance")]
105 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
107 public string Title {
109 string s = Attributes ["title"];
110 return (s == null) ? String.Empty : s;
113 if (value == null || value.Length == 0)
114 Attributes.Remove ("title");
116 Attributes ["title"] = value;
120 [DefaultValue (true)]
121 public virtual bool CausesValidation {
123 return ViewState.GetBool ("CausesValidation", true);
126 ViewState ["CausesValidation"] = value;
131 public virtual string ValidationGroup {
133 return ViewState.GetString ("ValidationGroup", String.Empty);
136 ViewState ["ValidationGroup"] = value;
140 protected internal override void OnPreRender (EventArgs e)
142 base.OnPreRender (e);
145 protected virtual void OnServerClick (EventArgs e)
147 EventHandler serverClick = (EventHandler) Events [serverClickEvent];
148 if (serverClick != null)
149 serverClick (this, e);
152 protected override void RenderAttributes (HtmlTextWriter writer)
154 // we don't want to render the "user" URL, so we either render:
155 EventHandler serverClick = (EventHandler) Events [serverClickEvent];
156 if (serverClick != null) {
157 ClientScriptManager csm;
160 PostBackOptions options = GetPostBackOptions ();
161 csm = Page.ClientScript;
162 csm.RegisterForEventValidation (options);
163 Attributes ["href"] = csm.GetPostBackEventReference (options, true);
166 if (hr != string.Empty)
168 // For J2EE portlets we need to genreate a render URL.
169 HRef = ResolveClientUrl (hr, String.Compare (Target, "_blank", StringComparison.InvariantCultureIgnoreCase) != 0);
171 HRef = ResolveClientUrl (hr);
175 base.RenderAttributes (writer);
177 // but we never set back the href attribute after the rendering
178 // nor is the property available after rendering
179 Attributes.Remove ("href");
182 protected virtual void RaisePostBackEvent (string eventArgument)
184 ValidateEvent (UniqueID, eventArgument);
185 if (CausesValidation)
186 Page.Validate (ValidationGroup);
188 OnServerClick (EventArgs.Empty);
191 PostBackOptions GetPostBackOptions ()
194 PostBackOptions options = new PostBackOptions (this);
195 options.ValidationGroup = null;
196 options.ActionUrl = null;
197 options.Argument = String.Empty;
198 options.RequiresJavaScriptProtocol = true;
199 options.ClientSubmit = true;
200 options.PerformValidation = CausesValidation && page != null && page.AreValidatorsUplevel (ValidationGroup);
201 if (options.PerformValidation)
202 options.ValidationGroup = ValidationGroup;
207 void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
209 RaisePostBackEvent (eventArgument);
212 [WebSysDescription("")]
213 [WebCategory("Action")]
214 public event EventHandler ServerClick {
215 add { Events.AddHandler (serverClickEvent, value); }
216 remove { Events.RemoveHandler (serverClickEvent, value); }