Archivo categoría ASP.NET 2.0 / 3.5
Cómo asignar un mismo procedimiento a múltiples botones
Por Pablo Viale - ASP.NET 2.0 / 3.5 - 5 Julio 2010
Supongamos que por alguna razón quieres colocar dos botones en una página ASP.NET que ejecuten el mismo procedimiento. Por ejemplo, un largo formulario con dos botones para guardar los cambios.
Solamente tienes que escribir el código para uno de los botones, como normalmente lo harías.
Y para el segundo, establece el evento "OnClick" al procedimiento del primer botón.
Aquí está un ejemplo con los dos botones:
-
<asp:Button ID="Guardar" runat="server" Text="Guardar cambios" />
-
<asp:Button ID="Guardar2" runat="server" Text="Guardar cambios" OnClick="Guardar_Click" />
¡Suerte!
Internet Explorer deja un espacio entre imágenes
Por Pablo Viale - ASP.NET 2.0 / 3.5 - 5 Julio 2010
A veces ASP.NET deja pequeños espacios de uno o dos pixeles entre una imagen y otra, como si se tratara de un “padding-bottom”. He encontrado que estos espacios en ocasiones se deben a saltos de línea (aunque suene ridículo) que se dejan en el código fuente.
Ejemplo:
-
<tr>
-
<td>
-
<asp:Image Id="Imagen1" runat="server">
-
</td>
-
</tr>
-
<tr>
-
<td>
-
<asp:Image Id="Imagen2" runat="server">
-
</td>
-
</tr>
Si lo anterior deja un espacio entre la imagen 1 y la imagen 2, intenta esto:
-
<tr><td><asp:Image Id="Imagen1" runat="server"></td></tr>
-
<tr><td><asp:Image Id="Imagen2" runat="server"></td></tr>
Claro que no debería ser, pero al parecer es algún bug de Internet Explorer.
Ahora bien, si lo que quieres es una solución más confiable, utiliza el siguiente estilo en tu hoja de estilos:
-
img { display: block; }
Como por arte de magia, el problema desaparece sin tener que estar eliminando saltos de línea en nuestro código.
Tip obtenido de mattPealing.
Exclusive access could not be obtained because the database is in use
Por Pablo Viale - ASP.NET 2.0 / 3.5, SQL Server - 14 Junio 2010
Intentas restaurar una base de datos desde un backup utilizando Microsoft SQL Server Management Studio y te aparece el siguiente error:
Restore failed for Server 'TuServidor'. (Microsoft.SqlServer.SmoExtended)
System.Data.SqlClient.SqlError: Exclusive access could not be obtained because the database is in use. (Microsoft.SqlServer.Smo)
Lo que ocurre es que la base de datos está abierta por otro proceso y debes cerrar todas las conexiones. Para hacerlo, abre una ventana de Query y coloca lo siguiente:
-
USE master
-
go
-
ALTER DATABASE nombre_de_tu_base_de_datos SET single_user WITH rollback immediate
-
ALTER DATABASE nombre_de_tu_base_de_datos SET multi_user
Este script fue tomado de un excelente post escrito por Sergio Tarrillo, en el cual puedes encontrar soluciones adicionales para este problema.
Cómo hacer una página que cierre la sesión
Por Pablo Viale - ASP.NET 2.0 / 3.5 - 1 Junio 2010
Para cerrar sesión en una aplicación de ASP.NET puedes utilizar el control LoginStatus, sin embargo en ocasiones querrás que esto ocurra al acceder una página, por ejemplo CerrarSesion.aspx. Para hacerlo coloca lo siguiente en el code-behind de dicha página:
-
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
-
FormsAuthentication.SignOut()
-
Session.Clear()
-
Session.Abandon()
-
Response.Redirect(FormsAuthentication.LoginUrl)
-
End Sub
Y listo, con eso cierras la autenticación, limpias y abandonas la sesión, y redireccionas a la página de login.
Saving changes is not permitted en SQL Server
Por Pablo Viale - ASP.NET 2.0 / 3.5, SQL Server - 1 Marzo 2010
Trabajando en una instalación limpia de SQL Server 2008, si intentas modificar la estructura de una tabla, puedes encontrarte este error al intentarla guardar:
Saving changes is not permitted. The changes you have made require the following tables to be dropped and re-created. You have either made changes to a table that can't be re-created or enabled the option Prevent saving changes that require the table to be re-created.
Si oprimes Cancel, no se guarda ningún cambio.
La solución es muy sencilla, abre Microsoft SQL Server Management Studio y haz clic en el menú Tools, y luego en Options.
Después en la columna izquierda selecciona Designers y desmarca la casilla Prevent saving changes that require table re-creation.
Y listo, ahora podrás modificar tu tabla y guardar los cambios.
Cómo posicionar verticalmente una página después de un PostBack
Por Pablo Viale - ASP.NET 2.0 / 3.5 - 18 Febrero 2010
En ocasiones tenemos un control de ASP.NET (por ejemplo un DataGrid o un DataPager) que está posicionado verticalmente en la mitad de una página, lo que significa que el visitante tuvo que haber desplazado la barra de desplazamiento (scrollbar) hacia abajo para llegar a ese punto. Si este control realiza un PostBack, cuando la página regresa al navegador, se muestra la parte superior de la página, sacando al visitante de contexto ya que tendría que volver a utilizar la barra de desplazamiento para visualizar el control. Esto no es nada amigable.
Para realizar el salto al punto vertical que decidas, coloca en ese lugar un ancla:
-
<a name="proyectos" />
Después agrega en el code-behind de tu página este procedimiento:
-
Private Sub RegistraScriptParaAncla(ByVal strAnchorID As String)
-
Dim Script As String = ""
-
Script &= "<script language=JavaScript id='BookMarkScript'>" & vbCrLf
-
Script &= "var hashValue='#" & strAnchorID & "';" & vbCrLf
-
Script &= "if(location.hash!=hashValue)" & vbCrLf
-
Script &= "location.hash=hashValue;" & vbCrLf
-
Script &= "</script>" & vbCrLf
-
If (Not Page.ClientScript.IsStartupScriptRegistered("BookMarkScript")) Then
-
Page.ClientScript.RegisterStartupScript(Me.GetType(), "BookMarkScript", Script)
-
End If
-
End Sub
Ahora, en alguna parte de tu code-behind que se ejecute en el PostBack, por ejemplo, al presionar un botón o la liga de un paginador, manda a llamar la función, de esta manera:
-
RegistraScriptParaAncla("proyectos")
Puedes tener varias anclas y hacer que la página se desplace a diferentes puntos basado en diferentes condiciones.
Este truco funciona perfectamente y el crédito es para el autor (y los que comentaron) de este post.
User, group, or role already exists in the current database.
Por Pablo Viale - ASP.NET 2.0 / 3.5, SQL Server - 8 Enero 2010
Seguramente te ha pasado que al migrar una base de datos de SQL Server de un servidor a otro, haces tu backup usando Microsoft SQL Server Management Studio, transfieres el archivo, y haces el restore en el nuevo servidor. Todo parece perfecto, pero cuando vas a crear tu usuario obtienes el siguiente error:
User, group, or role '' already exists in the current database. (Microsoft SQL Server, Error: 15023)
Entonces expandes tu base de datos, vas al nodo Security -> Users ->, buscas el usuario, y lo intentas borrar, pero entonces aparece otro error:
Drop failed for User ''. (Microsoft.SqlServer.Smo). The database principal owns a database role and cannot be dropped. (Microsoft SQL Server, Error: 15421)
En este punto te das cuenta de que el usuario está "huérfano" (orphaned), y una solución para darle la vuelta al problema es crear un nuevo usuario con otro nombre, asignarlo a la base de datos, y modificar el nombre del usuario en el Connection String de tu aplicación.
Pero existe una manera de solucionar las cosas correcta y fácilmente.
Abre una ventana de query en tu base de datos y teclea lo siguiente para ver los usuarios huérfanos:
-
EXEC sp_change_users_login 'Report'
Si ves a tu usuario ahí significa que efectivamente está huérfano y para deshuerfanizarlo
teclea lo siguiente:
-
EXEC sp_change_users_login 'Auto_Fix', 'user'
Modificando user por el nombre de tu usuario.
Y listo, asunto totalmente solucionado, no tienes que crear nuevos usuarios ni modificar las Connection Strings de tus aplicaciones.
Por último, si quieres crear un nuevo usuario para esta base de datos, usa:
-
EXEC sp_change_users_login 'Auto_Fix', 'user', 'login', 'password'
Referencia: Stupid Programmer.
Cómo agregar el salto de línea a los caracteres válidos de un FilteredTextBoxExtender
Por Pablo Viale - ASP.NET 2.0 / 3.5, Ajax - 20 Agosto 2009
En el Ajax Control Toolkit de ASP.NET, hay un control llamado FilteredTextBoxExtender que sirve para filtrar los caracteres que se pueden ingresar en un TextBox. Esto es útil, por ejemplo, para permitir únicamente el ingreso de números si estamos capturando un código postal mexicano.
Bueno, estaba usándolo en un TextBox con la propiedad TextMode establecida en MultiLine, lo que en HTML se despliega como un textArea, una caja de texto con múltiples líneas.
Esta es la definición de mi caja de texto y el control de filtrado:
-
<asp:TextBox ID="Tags" runat="server" TextMode="MultiLine" Width="200px"
-
Height="150px"></asp:TextBox>
-
<cc1:FilteredTextBoxExtender ID="Tags_FilteredTextBoxExtender" runat="server"
-
Enabled="True" TargetControlID="Tags"
-
ValidChars="abcdefghijklmnopqrstuvwxyz1234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZ">
-
</cc1:FilteredTextBoxExtender>
Como puedes ver, estoy permitiendo la entrada de letras mayúsculas, minúsculas, números y espacios. Pero como se trata de una caja de texto con múltiples líneas, obviamente quiero que se permita teclear saltos de línea cuando el individuo presione la tecla enter o intro.
Este caso es truculento, porque no puedes hacerlo en la página aspx, lo tienes que hacer en el código de servidor, de esta forma:
-
Tags_FilteredTextBoxExtender.ValidChars = Tags_FilteredTextBoxExtender.ValidChars & vbCrLf
Como sabrás, vbCrLf significa un salto de línea en Visual Basic, y lo que hace esa línea es añadirlo a los caracteres válidos.
Medio truculento pero funciona!
Cómo pasar el nombre del usuario logueado como parámetro a un ObjectDataSource
Por Pablo Viale - ASP.NET 2.0 / 3.5 - 3 Julio 2009
Los ObjectDataSource soportan por default diferentes tipos de parámetros, como controles, cookies, Form, QueryString, Profile y Session. Sin embargo si quieres pasar como parámetro el UserName del usuario logueado no lo puedes hacer con ninguno de los tipos antes mencionados.
Para hacerlo debes utilizar el evento Selecting del ObjectDataSource.
Esto funciona así, aquí tenemos el ObjectDataSource:
-
<asp:ObjectDataSource ID="ODSEjemplo" runat="server"
-
OldValuesParameterFormatString="original_{0}" SelectMethod="GetData"
-
TypeName="BLLObtenerDatos">
-
</asp:ObjectDataSource>
Fíjate como no hemos incluido ningún parámetro. Éste lo generamos en el code-behind:
-
Protected Sub ODSEjemplo_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs) Handles ODSEjemplo.Selecting
-
e.InputParameters("MiParametro") = User.Identity.Name
-
End Sub
Nótese que en el ejemplo, el método GetData recibe un sólo parámetro de tipo String, mismo que coincide con el tipo de User.Identity.Name
Así de sencillo.
Cómo leer un ConnectionString del web.config mediante código
Por Pablo Viale - ASP.NET 2.0 / 3.5 - 3 Julio 2009
En nuestro web.config guardamos los ConnectionStrings de nuestras bases de datos.
Ejemplo:
-
<connectionStrings>
-
<add name="MiConnectionString" connectionString="Data Source=Servidor\INSTANCIASQL;Initial Catalog=MiBaseDeDatos;Persist Security Info=True;User ID=NombreDeusuario;Password=xxxxxxxxxx" providerName="System.Data.SqlClient" />
-
</connectionStrings>
Es posible leer estos valores desde code-behind, de la siguiente forma:
-
Dim SuperSecreto As String = System.Web.Configuration.WebConfigurationManager.ConnectionStrings("MiConnectionString").ConnectionString



