Ago 8

Para que un formulario se envíe cuando el visitante oprima la tecla ENTER, coloca esta línea en el evento Load de tu página:

VB.NET:
  1. BusquedaTextBox.Attributes.Add("onKeyPress", "javascript:if (event.keyCode == 13) __doPostBack('" & BusquedaBoton.UniqueID & "','')")

En mi ejemplo, BusquedaTextBox es una caja de texto y BusquedaBoton es un LinkButton.

Incluso yo tengo un buscador en un MasterPage y otro buscador distinto en una página heredada de él. Puse el código tanto en el MasterPage como en la página, y ambos funcionan bien.

Jul 7

En ocasiones, cuando estás trabajando en Visual Web Developer 2008 con componentes ASP.NET de terceros (third party), notarás que no funciona el Intellisense y además el diseñador marca que tu componente no está definido. Este es un ejemplo de este problema con el componente FreeTextBox:

Component Not Declared

Noté que esto me pasaba por la siguiente razón:
Los archivos de mi aplicación están hosteados en un servidor (no en mi PC de desarrollo), por lo que creé una conexión a una unidad de red, asignándola a una letra. Es decir, había mapeado \\servidor\inetpub\wwwroot\proyecto a w:\proyecto. Al parecer si tienes tu servidor web de desarrollo corriendo en tu misma PC, lo anterior no ocurre, pero me parece que es muy probable que trabajes en una PC de desarrollo y accedas a un servidor de desarrollo mediante la red local donde están (y corren) los archivos de tu aplicación. Al menos es mi caso.

Para corregir esta situación tienes que agregar los DLLs del control en el GAC.

Deberás usar la utilidad gacutil.exe que viene en el SDK del .Net Framework 2. Si no lo tienes, descarga el SDK de aquí:
http://www.asp.net/Downloads/essential/

Coloca el componente (el DLL) en un fólder de la PC en la que usas Visual Web Developer 2008:
explorer.gif

Ahora abre una ventana de MS-DOS, cámbiate a la carpeta en la que tienes instalado el gacutil.exe y corre el comando:

gacutil -i nombredeldll.dll

Algo como esto:
Registrando el DLL en el GAC

Ahora reinicia Visual Web Developer, abre tu aplicación de nueva cuenta y mira como ya funciona el Intellisense y no aparece el error de que tu control no está declarado:
Intellisense funcionando

Espero que te sea de utilidad. :)

Actualización
Si necesitaras desinstalar la libreria del GAC, utiliza esta instrucción:
gacutil -u NombreDeLaLibreria
No escribas .dll
Por ejemplo:
gacutil -u FreeTextBox

Jun 25

Si deseas modificar información del MembershipUser utiliza el siguiente ejemplo, en el cual vamos a modificar únicamente el email:

VB.NET:
  1. Try
  2.     Dim ElUsuario As MembershipUser = Membership.GetUser(NombreUsuario.Text)
  3.     ElUsuario.Email = Email.Text
  4.     Membership.UpdateUser(ElUsuario)
  5. Catch ex As Exception
  6.     'Con ex.Message puedes desplegar los errores, por ejemplo en un label
  7.     'para darte cuenta si algo va mal al intentar la modificacion
  8. End Try

Jun 25

Si quieres modificar la contraseña de un usuario de tu Membership utiliza el método ChangePassword:

VB.NET:
  1. Try
  2.     Dim NuevaContrasena as String = "nueva"
  3.     Dim Usuario as String = "jperez"
  4.     Dim ElUsuario As MembershipUser = Membership.GetUser(Usuario)
  5.     ElUsuario.ChangePassword(ElUsuario.ResetPassword(), NuevaContrasena )
  6. Catch ex As Exception
  7.     'Con ex.Message puedes desplegar los errores, por ejemplo en un label
  8.     'para darte cuenta si algo va mal al intentar la modificacion
  9. End Try

El ejemplo anterior sirve para modificar la contraseña sin conocerla, por ejemplo, para un módulo de un administrador que puede modificar contraseñas de usuarios.

Sin embargo, si lo que buscas es un módulo en el cual el propio usuario modifique su contraseña, y para añadir seguridad quieres que la persona tenga que poner su actual contraseña y su nueva contraseña, entonces simplemente llama la función de esta manera:

VB.NET:
  1. Dim Resultado As Boolean = ElUsuario.ChangePassword(ContrasenaActual.Text, Contrasena.Text)

ContrasenaActual es un TextBox en el cual solicitas la contraseña actual.
Contrasena es un TextBox en el cual solicitas la contraseña nueva.

Si Resultado es True, quiere decir que el usuario tecleó su contraseña actual correctamente y se hizo el cambio de contraseña. Si es False entonces tecleó incorrectamente su contraseña actual y no se hizo la modificación.

May 30

Si tienes una aplicación usando Membership con varios Roles y necesitas redirigir al usuario a diferentes páginas de acuerdo al rol en el que se encuentra utiliza el siguiente código.

Este es tu control Login en tu página:

ASP:
  1. <asp:Login ID="Acceso" runat="server" BorderPadding="8" 
  2.         DisplayRememberMe="False"
  3.         FailureText="Datos inválidos, por favor inténtelo de nuevo."
  4.         LoginButtonText="Entrar" LoginButtonType="Button"
  5.         PasswordLabelText="Contraseña:" TitleText=""
  6.         UserNameLabelText="Nombre de usuario:"
  7.         DestinationPageUrl="">
  8.         <ValidatorTextStyle CssClass="Validador" ForeColor="" />
  9.         <FailureTextStyle CssClass="Validador" ForeColor="" />
  10.         <TitleTextStyle CssClass="Titulo" Font-Bold="True" HorizontalAlign="Left" />
  11.         <TextBoxStyle Font-Bold="False" />
  12.         <LoginButtonStyle Font-Bold="False" />
  13.         <LabelStyle Font-Bold="True" HorizontalAlign="Left" />
  14.         <CheckBoxStyle HorizontalAlign="Right" />
  15.     </asp:Login>

Este es el código para realizar la redirección:

VB.NET:
  1. Protected Sub Acceso_LoggedIn(ByVal sender As Object, ByVal e As System.EventArgs) Handles Acceso.LoggedIn
  2.         Dim ElLogin As Login
  3.         ElLogin = CType(sender, Login)
  4.         If Roles.IsUserInRole(ElLogin.UserName, "Administrador") = True Then
  5.             Response.Redirect("~/Administrador/Default.aspx")
  6.         Else
  7.             If Roles.IsUserInRole(ElLogin.UserName, "UsuarioRegular") = True Then
  8.                 Response.Redirect("~/Usuario/Default.aspx")
  9.             End If
  10.         End If
  11.     End Sub

Importante: Es muy probable que tu página de inicio de sesión se llame "Login.aspx", si haces eso, entonces la clase de la página llevará el nombre de "Login", y esto se confunde con la clase del control "Login". Si no funciona el código anterior quizás tengas este problema, solamente renombra tu página (lo más importante es renombrar su clase) a cualquier otra cosa, por ejemplo: PaginaLogin o Default.

May 22

Utilizando ASP.NET 3.5 y AJAX me encontré con la siguiente excepción:

Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.

sys.gif

Para solucionarlo simplemente agrega una sección triggers a tu updatepanel referenciando al botón que envía el formulario. Así:

ASP:
  1. <asp:UpdatePanel ID="UpdatePanel1" runat="server">
  2.    <Triggers>
  3.       <asp:PostBackTrigger ControlID="MiBoton" />
  4.    </Triggers>
  5.    <ContentTemplate>
  6.    ...tu contenido aquí...
  7.    </ContentTemplate>
  8. </asp:UpdatePanel>

Normalmente esto siempre funciona, pero si no, visita esta página que contiene toda la explicación completa y más opciones de resolución.

Abr 15

La situación es esta:

Tengo dos controles TextBox de ASP.NET en un formulario de captura. En la mayoría de los casos el usuario deberá capturar el mismo valor en ambos. Entonces quiero hacer que cuando el usuario capture el primer campo y brinque al segundo (en ese momento se dispara el evento onblur de JavaScript del primer campo) el valor capturado se copie automáticamente al segundo campo.

Para hacer esto hay que combinar el uso de ASP.NET con JavaScript de la siguiente forma.

Primero crea la función VB.NET que genera el código JavaScript:

VB.NET:
  1. Public Function SetText(ByVal Control1 As Control, ByVal Control2 As Control) As String
  2.         'Genera codigo JavaScript que copiara el contenido del campo Control1
  3.         'al campo Control2 en el momento que el usuario salga (onblur) del Control1
  4.         Dim Script As New System.Text.StringBuilder
  5.         Dim ClientID1 As String = Control1.ClientID
  6.         Dim ClientID2 As String = Control2.ClientID
  7.         With Script
  8.             .Append("document.getElementById('")
  9.             .Append(ClientID1)
  10.             .Append("').value = ")
  11.             .Append("document.getElementById('")
  12.             .Append(ClientID2)
  13.             .Append("').value;")
  14.         End With
  15.         Return Script.ToString
  16.     End Function

La función anterior puede ir en el código de tu página. Ahora, en el evento Page_Load puedes usarla así:

VB.NET:
  1. MiTextBox1.Attributes.Add("onblur", SetText(MiTextBox1, MiTextBox2))

Código creado basándome en: http://www.mredkj.com/vbnet/TextboxScriptFunctions.html

Abr 14

Existen tres formas de hacer DataBind en ASP.NET 3:

Eval. Es un DataBind en una sola dirección, lo que significa que obtiene el dato del DataSource pero si ocurre alguna modificación en el campo, no lo puede regresar al DataSource.

Ejemplo:

ASP:
  1. <%#Eval(”NombreDeLaColumna”)%>

Bind. Es un DataBind de dos direcciones, lo que significa que obteiene el dato del DataSource y si ocurre alguna modificación en el campo, lo regresa al DataSource para su modificación.

Ejemplo:

ASP:
  1. <%#Bind(”NombreDeLaColumna”)%>

Uso de una función. Es posible utilizar una función para mostrar un dato. Toma esta situación por ejemplo: En la tabla que estamos mostrando tenemos una llave foránea, que hace la relación con otra tabla. En vez de mostrar el ID numérico (por ejemplo 34) es mejor mostrar un campo alfanumérico, pero ese campo alfanumérico se encuentra en la otra tabla. Para accederlo puedes crear una función a la cual le des como entrada el ID numérico y regrese el valor alfanumérico legible para el usuario.

Ejemplo:

ASP:
  1. <%# Funciones.ObtenDatoAlfanumerico(Eval("IdTabla")) %>

Es muy útil saber esto, sobre todo el tercer ejemplo.

Feb 24

A veces es necesario insertar un valor nulo (null) en una base de datos de SQL Server usando ASP.NET.

Esto puede ocurrir ya sea en un insert o un update.

Suponiendo que el tipo de datos en la base de datos es un smallint y sabiendo que en ASP.NET corresponde a un tipo de datos Int16, esta es la manera de declarar un entero nulo:

VB.NET:
  1. Dim EnteroNulo As Nullable(Of Int16) = Nothing

Y listo, ahora lo puedes usar en tu DAL o BLL:

VB.NET:
  1. Dim RenglonesAfectados As Integer = Adapter.ModificaTabla(Fecha, EnteroNulo)

Feb 22

Si vas a implementar el Membership Provider de ASP.NET con SQL Server, seguramente encontrarás mucha información en Internet de cómo hacerlo. La parte que no todo mundo explica es cómo crear las tablas que contendrán toda la información de nombres de usuario, contraseñas, roles, etc.

Las tablas se crean mediante la herramienta aspnet_regsql.exe que se encuentra en el directorio de la versión del Framework que estés usando (ejemplo: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727). Si usas la versión 3.5 tienes que usar la herramienta que viene en el fólder de la versión 2.

Abre una ventana de MS-DOS y cámbiate a dicho fólder:

aspnet_regsql.exe

La sintáxis de la herramienta es:

Option Description

-?

Prints Aspnet_regsql.exe Help text in the command window.

-W

Runs the tool in wizard mode. This is the default if no command-line arguments are specified.

-C <connection string>

Specifies the connection string to the computer running SQL Server where the database will be installed, or is already installed. This option is not necessary if you specify only the server (-S) and login (-U and -P, or -E) information.

-S <server>

Specifies the name of the computer running SQL Server where the database will be installed, or is already installed.

-U <login ID>

The SQL Server user ID to log in with. This option also requires the password (-P) option. This option is not necessary if you are authenticating using Windows credentials (-E).

-P <password>

The SQL Server password to log in with. This option also requires the user ID (-U) option. This option is not necessary if you are authenticating using Windows credentials (-E).

-E

Authenticates using the Windows credentials of the currently logged-on user.

-sqlexportlonly <filename>

Generates a SQL script file that can be used to add or remove the specified features. The specified actions are not performed.

 

Option Description

-A all|m|r|p|c|w

Adds support for one or more ASP.NET application services. Service identifiers can be specified together or separately. The following identifiers are used for ASP.NET application services:

all - All services, including common tables and stored procedures shared by the services

m - Membership

r - Role Manager

p - Profile

c - Web Parts Personalization

w - Web Events

-R all|m|r|p|c|w

Removes support for one or more application services. Service identifiers can be specified together or separately. The following identifiers are used for ASP.NET application services:

all - All services, including common tables and stored procedures shared by the services

m - Membership

r - Role Manager

p - Profile

c - Web Parts Personalization

w - Web Events

-Q

Runs the tool in quiet mode and does not confirm before removing an application service.

-d <database>

Specifies the name of the database to create or modify for use with application services. If the database is not specified, the default database name of "aspnetdb" is used.

 

Si necesitas más información, visita esta página.

En un caso sencillo, solamente necesitamos habilitar el Membership provider y el Role provider, por lo que nuestra sintáxis sería:

aspnet_regsql -S servidor\sqlexpress -U usuario -P contrasena -A mr -d nombredelabasededatos

Donde:

-S va seguido del nombre de tu servidor, ya sea en tu red local o en Internet (usa la IP)
-U va seguido de tu nombre de usuario
-P va seguido de tu contraseña
-A va seguido de "mr" ya que queremos habilitar el Membership y Role.
-d va seguido del nombre de tu base de datos

Creando las tablas para el Membership y Role Providers

Listo, ahora solamente verifica que se crearon las tablas correctamente:

Tablas de Membership y Role Provider

Actualización 2008-05-10

Para entender cómo están relacionadas las tablas entre sí, puedes revisar el siguiente diagrama:

Diagrama de tablas del Membership y Role Provider

El siguiente paso sería crear el connectionString en tu archivo web.config, ponlo bajo la sección configuration:

XML:
  1. <connectionStrings>
  2.     <add name="MiConnectionString" connectionString="Data Source=SERVIDOR\SQLEXPRESS;Initial Catalog=nombredelabasededatos;Persist Security Info=True;User ID=usuario;Password=contrasena"
  3.      providerName="System.Data.SqlClient" />
  4.   </connectionStrings>

Y luego, bajo la sección system.web coloca lo siguiente:

XML:
  1. <!--
  2.             The <authentication> section enables configuration
  3.             of the security authentication mode used by
  4.             ASP.NET to identify an incoming user.
  5.         -->
  6.       <authentication mode="Forms">
  7.         <forms loginUrl="~/Default.aspx" name=".ASPXFORMSAUTH" timeout="300"/>
  8.       </authentication>
  9.       <roleManager defaultProvider="MiRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName=".ASPROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All">
  10.         <providers>
  11.           <clear/>
  12.           <add name="MiRoleProvider" connectionStringName="MiConnectionString" applicationName="NOMBREAPP" type="System.Web.Security.SqlRoleProvider"/>
  13.         </providers>
  14.       </roleManager>
  15.       <membership defaultProvider="MiMembershipProvider">
  16.         <providers>
  17.           <clear/>
  18.           <add name="MiMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MiConnectionString" applicationName="NOMBREAPP" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="true" passwordFormat="Clear"/>
  19.         </providers>
  20.       </membership>

Con esto le indicas a tu aplicación que utilice para la autenticación la base de datos que creaste al inicio.

Ahora, para crear usuarios y roles utiliza la herramienta que viene incluida con Visual Web Developer 2008, haz clic en Website -> ASP.NET Configuration:

aspnetconfiguration.gif

Esto abrirá una ventana de tu navegador y podrás ver la página administrativa en la que puedes crear roles, usuarios y asignar esos usuarios a los roles que desees. Esta página administrativa, para conectarse a la base de datos, utiliza los valores establecidos en el web.config.

herramienta.gif

Ya no explico cómo usar esta herramienta porque es muy sencilla.

Si estás trabajando en un servidor local y creaste algunos roles y usuarios, y tienes que subir esa información al servidor con algún programa de sincronización de bases de datos, hazlo en este orden para evitar errores de integridad referencial:

La siguiente tabla no debe ser sincronizada porque el procedimiento de aspnet_regsql rellena la información necesaria:
aspnet_SchemaVersions

Primera pasada:
aspnet_Applications

Segunda pasada:
aspnet_Users

Tercera pasada:
aspnet_Membership

Cuarta pasada:
aspnet_Roles

Quinta pasada:
aspnet_UsersInRoles

Suerte!

« Previous Entries