Problemas con CauseValidation en Microsoft.Web.UI.WebControls.Toolbar
Si has utilizado alguna vez en tus desarrollos el control Toolbar de los Internet Explorer WebControls, habrás podido observar que cuando pulsas sobre un ToolbarButton no causa validación en el cliente y si en vuestras páginas tenéis controles de tipo RequiredFieldValidator, CompareValidator... no validarán los datos de la página y en mi caso a uno de mis clientes le gusta bastante la barrita, con lo cual no me quedó otra que buscar como podía hacerlo.
No me gusta atribuirme lo que no es mío, voy a hacer referencia a la página donde encontré la solución:
http://forums.asp.net/thread/905318.aspx
Pero he de decir que ese ejemplo está un poco incompleto aunque me abrió la mente para desarrollarlo por completo, y en este post lo explicaré:
Como bien dice BillKrat, la idea es añadir un atributo al ToolBar para identificar que queremos utilizar nuestro propio click:
1: <iewc:Toolbar id="tBar" useClickOnClientBefore="true" runat="server">
En mi caso lo he llamado useClickOnClientBefore (en el ejemplo useMyClick).
Una vez echo esto necesitamos modificar la función javascript que dispara un ToolBarButton al ser pulsado y para ello vamos a editar el archivo toolbar.htc que está en mi caso en C:\Inetpub\wwwroot\webctrl_client\1_0. Buscamos la función: function f_FireButtonClick(oCell) y modificamos su código por:
1: if (typeof(useClickOnClientBefore) != "undefined" && useClickOnClientBefore=="true")
2: ClickOnClientBefore(oCell);
3: else
4: evButtonClick.fire(f_CreateEventObject(oCell));
Si has mirado el link que puse antes y pruebas el ejemplo te encontrás un error si tienes 2 toolbar y en una de ellas no pusieses el atributo useMyClick, y te dirá que useMyClick no está definido, por eso yo compruebo que useClickOnClientBefore está definido en el Toolbar y sino lanzó el click normal del ToolBar.
Una vez hecho esto, necesitamos crearnos en un archivo de script o en la misma página la función ClickOnClientBefore, que será la que controle los click de los botones:
1: <script language="javascript">
2: function ClickOnClientBefore(oButton)
3: { 4: switch(oButton.id)
5: { 6: case "enviar":
7: if (typeof(Page_ClientValidate) == 'function')
8: { 9: if (Page_ClientValidate())
10: { 11: __doPostBack('tBar',0) 12: }
13: }
14: break;
15: }
16: }
17: </script>
Y ya en el servidor podemos recoger el evento:
1: private void tBar_ButtonClick(object sender, System.EventArgs e)
2: { 3: this.OnButtonClick((ToolbarButton)sender);
4: }
5:
6: private void OnButtonClick(ToolbarButton tButton)
7: { 8: switch(tButton.Index)
9: { 10: case 0:
11: Response.Write("Has Pulsado Enviar"); 12: break;
13: }
14: }
Y con esto ya podemos validar datos en cliente o lanzar alertas, emsajes de confirmación o cualquier código javascript que se te ocurra. Adjunto el código de ejemplo con el archivo toolbar.htc, no obstante si alguien conoce una manera mas efectiva que no dude en comentarlo.
Salu2.