Par Thierry Thoua,
dimanche, juin 1 2008.
Lien permanent
ASP.NET
J'ai profité de mon voyage en TGV pour écrire ce petit post. En effet, je m'étais laissé une heure pour créer un bouton qui effectue un GET et non un POST en ASP.NET. Je montre ici une possibilité... L'autre possibilité à laquelle j'ai pensé est un hyperlink customisé en CSS ou un "<form method="get">" vide ... Pour garder un look bouton sans problème, j'ai retenu mon idée de bouton qui contient le lien dans l'attribut javascript "onclick". Si vous avez d'autres idées, je suis preneur ;-)
Voici la classe qui représente le bouton en GET. Le bouton se désactivera automatiquement après le click. La classe hérite de WebControl pour avoir le support de la méthode CssClass. Si on avait pas besoin de CSS, on aurait pu hériter de Control.
public class ButtonGetJavascript : WebControl
{
public string DestinationPath
{
get { return (string)ViewState["DestinationPath"]; }
set { ViewState["DestinationPath"] = value; }
}
public string Text
{
get { return (string)ViewState["Text"]; }
set { ViewState["Text"] = value; }
}
protected override void Render(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Type, "button");
writer.AddAttribute(HtmlTextWriterAttribute.Value, this.Text, true);
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass);
writer.AddAttribute(HtmlTextWriterAttribute.Onclick,
"this.disabled=true;self.location.href='" + this.DestinationPath + "'");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
}
}
Voici le code ASP.NET pour avoir ce bouton ...
<form id="form1" runat="server">
<div>
<cc1:ButtonGetJavascript ID="but1" runat="server"
DestinationPath="http://www.kame.net" Text="Kame !!" />
</div>
</form>
5 réactions
1 De Pierre-Emmanuel Dautreppe - 02/06/2008, 11:16
Hello titi ! :-)
Juste pour relever une (mini) erreur et quelques (mini) propositions d'améliorations :
- Tu "set" le Id et le Name avec le UniqueId alors que tu devrais utiliser le UniqueId et le ClientId.
- Il est possible de simplifier ton Render en déplaçant ton code vers AddAttributesToRender et en virant la génération du tag Input (qui sera spécifié par le constructeur par exemple, ou par le TagKey)
2 De Pierre-Emmanuel Dautreppe - 02/06/2008, 13:36
Et au passage, si tu relis le post www.pedautreppe.com/post.... sur les control adapter, tu verras qu'il peut être assez dangereux d'overrider le "Render" d'un WebControl. (Enfin dangeureux n'est pas le terme, mais disons que ça peut amener des comportements innatendus lors de l'utilisation des WebControls)
3 De Thierry Thoua - 03/06/2008, 17:41
4 De Pierre-Emmanuel Dautreppe - 04/06/2008, 20:15
Un commentaire encore ! :-p
ça serait intéressant de gérer aussi la notion de "Enabled", il faudra alors modifier le javascript de façon à ne faire le onclick que si le lien est activé.
En fait c'est juste parce que je m'interroge dans ce cas, à savoir si on devrait modifier le onclick ou s'il y a un moyen HTML normal ou non.
5 De Thierry Thoua - 05/06/2008, 19:54
En quelques minutes, voici ce que je ferais pour la notion de "disabled". Apres .. mon else ... il est la pour nettoyer le code de la partie javascript mais je pourrais le laisser. Le comportement ne changerait pas.