miércoles, 6 de abril de 2011

ASP.NET - Utilizar PageMethods desde control de usuario

use_pagemethods_from_user_control Dado el tremendo éxito de el post ASP.NET - PageMethods vs. WebMethods, me hicieron algunas preguntas con respecto a algunos casos que se les presentaron...
por ejemplo me decían: “cuando declaro el PageMethod en un control de usuario, ya no funciona el pageMethod”
Y es obvio, no debería funcionar, porque un PageMethod sólo puede ser declarado dentro de una página, no en un control de Usuario.
Eso significa que si todo mi código está dentro de un control de usuario ya no podemos usar el PageMethod?
Noooooo, de ninguna manera, claro que se puede seguir usando, sólo hay que reordenar las cosas.
Vamos a hacer el típico ejemplo de verificar si un email ya existe. Empecemos:
1.- Declara el PageMethod dentro de una página llamada WebForm1.aspx
[System.Web.Services.WebMethod]
public static string CheckEmail(string email)
{
if (email == "email@dominio.com")
return "Ya existe un usuario con ese email.";
else
return "el email está disponible.";
}


No te olvides que en el código aspx de la página debe haber un scriptmanager con enablePageMethods=”true”

<asp:ScriptManager ID="ScriptManager1" EnablePageMethods="true" runat="server">
</asp:ScriptManager>

Ahora añadimos un control de usuario llamado wucUser.ascx, y allí creamos un pequeño formulario, para que produzca la imagen de arriba.

Dense cuenta que en la imagen de arriba he encerrado un link, el cual ejecuta un método javascript...

<a href="javascript:;" onclick="chequearDisponibilidad('<%= txtEmail.ClientID %>')">Chequear disponibilidad</a>


pero, pero, pero… esta es la parte interesante, el método javascript que estamos invocando está en la página aspx, no en el control de usuario.

Y nada más. así de simple. Este es el código completo:

WebForm1.aspx:

<%@ Register Src="wucUser.ascx" TagName="wucUser" TagPrefix="uc1" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Usar PageMethods desde controles de usuario</title>
<script type="text/javascript">
function chequearDisponibilidad(txtEmail) {
PageMethods.CheckEmail($get(txtEmail).value, onSucceed, onError);
}

function onSucceed(result) {
alert(result);
}
function onError(result) {
alert(result.get_message());
}    
</script>
<style type="text/css">
*{  font-family: Trebuchet MS;
padding: 5px;
}
.header{
width: 220px;
margin: auto auto;
text-align: center;
background-color: orange;
background-color: black;
color: white;
}
th{ background-color: black;
color: White;
}
td{ background-color: orange; }
</style>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" EnablePageMethods="true" runat="server">
</asp:ScriptManager>
<uc1:wucUser ID="wucUser1" runat="server" />
</form>
</body>
</html>


public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}

[System.Web.Services.WebMethod]
public static string CheckEmail(string email)
{
if (email == "email@dominio.com")
return "Ya existe un usuario con ese email.";
else
return "el email está disponible.";
}
}

control de usuario wucUser.ascx:

<table style="width: 300px">
<tr>
<th colspan="2">Datos del usuario</th>
</tr>
<tr>
<td style="width: 10%">Usuario:</td>
<td>
<asp:TextBox ID="txtUserName" Width="90%" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>Email:</td>
<td>
<asp:TextBox ID="txtEmail" Width="90%" runat="server"></asp:TextBox>
<br />
<a href="javascript:;" onclick="chequearDisponibilidad('<%= txtEmail.ClientID %>')">Chequear disponibilidad</a>
</td>
</tr>
<tr>
<td>Contraseña:</td>
<td>
<asp:TextBox ID="txtPassword" Width="90%" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td style="text-align: right" colspan="2">
<asp:Button ID="btnSave" runat="server" Text="Guardar" />
</td>
</tr>
</table>

Eso es todo. Ejecuta la página WebForm1.aspx y presiona el link “Chequear disponibilidad”, verás que se verifica la información en el lado del servidor, pero se devuelve la respuesta desde javascript.

Y de esta manera hemos demostrado que sí se puede ejecutar un PageMethod desde un control de usuario.

Espero que les sea de utilidad ;)

No hay comentarios.: