sábado, 10 de julio de 2010

MsgBox en CodeBehind: Sacándome la duda

 

Hoy, antes que nada, es un post muy VB.
NOTA: Viendo los Snippets de Código en Blogger, veo que no salen como deberían. El código está completo simplemente tiene doble línea donde no debería, entonces nada más háganle scroll mientras reviso que puedo hacer para arreglarlo.
Ahora si, la historia behind este post:
Un día, un amigo en una clase de la universidad me pidió ayuda porque un webform no le funcionaba. Resulta que luego de ver el código, ví que tenia muchos msgbox en el codebehind: le pregunté porqué, me dijo que lo usaba para mostrar validaciones en la página, y para mostrar mensajes de error.


Luego de revisarle y corregirle el error por el que me pidió ayuda (más adelante les diré cuál fue), me quedé con la duda…. ¿Esos MsgBox, saldrán en el servidor o en el cliente (poco lógico)? Que pasará con un servidor remoto si le solicito mil veces la página con “validaciones” y msgbox?
Bueno, aquí está el post para sacarme la duda. Les confieso que en este momento, estoy escribiendo la entrada usando Live Writer Beta (como siempre), y aún no he visto que sucede, no he escrito una sola línea de código, ni he abierto siquiera Visual Studio. Quiero que me acompañen desde el inicio porque, sinceramente, VB me da miedo!.
VS1post
Nos Creamos el Proyecto, ASP.NET app en Visual Basic:
vsNuevoProyecto[3]
Y Usamos la página recién creada, le agregamos un calendario, y un botón, además de algo de texto, para hacer algo menos feo.
vsPagina
Finalmente, el código en el code behind:
   1: Public Class _Default



   2:     Inherits System.Web.UI.Page



   3:  



   4:     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load



   5:  



   6:     End Sub



   7:  



   8:     Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click



   9:         If (Me.IsPostBack) Then



  10:             MsgBox("La fecha Seleccionada es: " + Calendar1.SelectedDate)



  11:  



  12:         End If



  13:  



  14:     End Sub



  15: End Class




(ninguna parte de este código pretende mostrar las mejores prácticas de programación en VB+asp.net: Soy un programador casi que exclusivo de C#)


Ahora si, cargamos la página, seleccionamos una fecha, y le damos clic al botón:


VS_PáginaCorriendo





Como vemos, nos aparece el msgbox, y el navegador ( el flamante Firefox 4 Beta 1 ) espera, y carga de nuevo hasta que le demos clic en aceptar en el bendito msgbox. Pero este mensaje no nos sale del navegador! Sale de la nada, hay que darle clic al ícono para verlo, no tiene icono, etc. Ahora, como ya lo vimos funcionando, hagamos un deploy de esta página para verla remotamente ( usaré otra computadora que tengo con Windows Server 2008 R2 y IIS 7.5 para mostrarles el ejemplo )


Antes de mostrarles nada, y recordándoles que lo estoy haciendo junto con uds, les mostraré el resultado (cuando debería de mostrar el msgbox) en un IIS Remoto:


VS-IISREmoto





Y en un IIS local:


VS-IISLocal







Como ven, es sencillo, IIS NO te deja tener MsgBox, mientras que el Servidor de Desarrollo de Visual Studio si te deja. Pero si lo pensamos, es el comportamiento ESPERADO por lo menos puesto que, si tenemos una app en un servidor real, y un usuario ejecuta alguna acción que requiere que acepte un msgbox, ¿en que momento podrá aceptarlo, si este aparece en el servidor? Para esto, un thread (o todo el servidor ) estaría on hold esperando respuesta de un mensaje que, posiblemente, nunca será aceptado. Por esto, es que tenemos que estar probando nuestras aplicaciones en IIS, y no arriesgarnos a siempre utilizar solo cassini.


Finalmente, el problema de mi amigo era que, tenia algo más o menos así:







   1: Public Class _Default



   2:     Inherits System.Web.UI.Page



   3:  



   4:     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load



   5:         'Aquí cargo datos de una fuente X y lleno los controles



   6:  



   7:     End Sub



   8:  



   9:     Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click



  10:         'Botón de actualizar. Nunk funcionaba porque en cada postback el Page_Load sobreescribía los datos



  11:  



  12:     End Sub



  13: End Class







Bueno, como ya saben, la solución es sencilla.


Saludos y hasta el próximo Post!





NOTA: Viendo los Snippets de Código en Blogger, veo que no salen como deberían. El código está completo simplemente tiene doble línea donde no debería, entonces nada más háganle scroll mientras reviso que puedo hacer para arreglarlo.

5 comentarios:

  1. Vamos a ver, entiendo el punto del post en terminos de que esta explicando el error. Solo quiero decir que no tiene ningun sentido utilizar ese MsgBox,muchas veces ese tipo de cosas pasan porque no se tiene claro el paradgima ni la arquitectura de aplicaciones web, el ciclo del request, que corre en el server y que en el cliente, y no solo eso si no que DBERIA correr donde...

    Desgraciadamente ASP.NET (Y quizas por su naturaleza) no fue pensado para ser muy "compatible" o "mezclable" con cosas a nivel de cliente, ya que esta mas orientado a proceso en el servidor, y muchas veces no tenemos mas que un RegisterScript, es por esto que hay que 'definitivamente' conocer de ambos mundos (Server Side y Client Side) para poder sacar el provecho VERDADERAMENTE al desarrollo web con ASP.NET...

    Conclusion para su companero, haga ese tipo de cosas con javascript (dialogs y demas), o si lo que quiere es debuguear utilice las herramientas (Librerias, Break points, watch, Tracers, o minimo un Console.Write) cuando quiera rastrear un bug o ver el estado de una parte de la aplicacion en un momento determinado, Pura Vida !!!

    ResponderEliminar
  2. Como puse al principio, yo si tenia claro que estaba mal, le sugerí usar javascript entre otras cosas para poner las validaciones, pero como dices, él no tenia claro el paradigma y tampoco tenia chance o tiempo para aprenderlo porque el trabajo era de entregar en un par de horas o algo así.

    Eso que dices de asp.net que no sea mezclable con lado cliente, sigo recomendando asp.net mvc...

    Finalmente, gracias por comentar;-)

    ResponderEliminar
  3. Mae si pero es que ustedes los jóvenes de ahora ( habló mi abuelo ) nacieron con MVC mientras algunos otros le hemos dado rato a ASP.NET y el modelo de "code behind". A mi se me hace muy atractivo pero en muchas empresas tienen sites gigantescos contruidos usando otras formas y algunas veces no da chance de variar sobre la marcha. Está tuanis el blog.

    ResponderEliminar
  4. Los jovenes de ahora? mae gracias! Yo a veces me siento ya viejo... jejejeje
    Siguiendo, creo que escoger entre ASP.NET solo o con MVC es cuestión de gustos y de circunstancia, pero mi idea no es condenar una o la otra, simplemente prefiero MVC, talvéz porque sea la que más conozco.
    En fin, gracias por comentar. Saludos!

    ResponderEliminar
  5. A mi me encanta Mvc, y cuando puedo lo uso, pero a veces nos dan un sitio terminado en otra tecnología y no queda más que apegarse. También con JQuery y Web services se pueden hacer maravillas, sin code behind.

    ResponderEliminar