Archivo Junio, 2007

Error de solicitud de permiso de tipo ‘System.Web.AspNetHostingPermission

Al trabajar en Visual Web Developer 2005 Express Edition (VWD) puedes obtener este error:

Error 18 Error de solicitud de permiso de tipo 'System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. (W:\MiAplicacion\web.config line 46) W:\MiAplicacion\Admin\Default.aspx 3

En inglés:

Request for the permission of type 'System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

Este error aparece por cada uno de los controles que existan en cada una de las páginas. Si abres el code-behind de alguna página, notarás que los controles que aparecen en el correspondiente aspx no son reconocidos, por lo que el Intellisense no funciona y programar se vuelve medio imposible.

Esta situación puede ocurrir cuando se tiene una máquina para desarrollo y un servidor en la red local. La máquina del desarrollador se usa solamente para correr VWD y en el servidor se corre el IIS y se almacena la aplicación. El desarrollador mapea una letra a un recurso compartido (share) en el servidor, de tal manera que, por ejemplo, W: mapee a \\servidor\aplicacion\.

Debido a que estamos trabajando en un recurso compartido, se muestra el error anterior por cuestiones de seguridad.

Para resolverlo se debe hacer lo siguiente:

En la máquina del desarrollador, hay que abrir la herramienta Inicio -> Panel de Control -> Herramientas Administrativas -> Configuración de Microsoft .NET Framework 2.0:

Configuración de Microsoft .NET Framework 2.0

Después se debe expander el árbol para mostrar: Console Root -> .NET Framework 2.0 Configuration -> My Computer -> Runtime Security Policy y hacer clic en la liga que dice: Adjust Zone Security:

Security Adjustment Wizard

Dejar marcada la opción Make changes to this computer y dar clic en siguiente. En la pantalla que aparece se debe seleccionar la opción Local Intranet y ajustar el selector a Full Trust:

Full Trust

Después dar clic en Next y luego en Finish.

Reinicia VWD y vuelve a compilar tu aplicación. Todo debe funcionar bien ahora. Si no funciona con Build intenta con Rebuild.

Nota importante:

He notado que en algunos casos para eliminar este error además de Local Intranet hay que seleccionar Internet y establecer el selector en Full Trust.

4 Comentarios

Formatear una fecha dentro de un GridView usando DataFormatString

Si dentro de un GridView intentas colocar una fecha, dándole formato con DataFormatString:

ASP:
  1. <asp:BoundField DataField="fechareg" HeaderText="fechareg" SortExpression="fechareg" DataFormatString="{0: dd/MM/yyyy}" />

Notarás que la fecha sigue saliendo con este formato:

6/21/2007 11:49:52 PM

¿Por qué no se aplica el formato? Para prevenir ataques maliciosos, el valor del campo esta codificado, HtmlEncoded. La codificación HtmlEncoding ocurre antes de aplicarse el formato, por lo cual éste no tiene efecto.

Para solucionar el problema debes apagar la codificación para ese campo, de esta manera:

ASP:
  1. <asp:BoundField DataField="fechareg" HeaderText="fechareg" SortExpression="fechareg" DataFormatString="{0: dd/MM/yyyy}" HtmlEncode="false" />

Aquí puedes encontrar información sobre el formateo de strings:

http://msdn2.microsoft.com/en-us/library/26etazsy(VS.80).aspx

No hay Comentarios

Cómo obtener los elementos seleccionados de un CheckBoxList

El CheckBoxList contiene varios elementos de tipo CheckBox. Para obtener todos los valores que han sido seleccionados tenemos que iterar en su colección de ListItems.

Tenemos este control:

ASP:
  1. <asp:CheckBoxList ID="c02" runat="server">
  2.     <asp:ListItem>Verde</asp:ListItem>
  3.     <asp:ListItem>Blanco</asp:ListItem>
  4.     <asp:ListItem>Rojo</asp:ListItem>
  5. </asp:CheckBoxList>

En el código siguiente guardaremos en la variable cadena02 todos los CheckBoxes que han sido seleccionados. El punto y coma es solamente para usarlo como separador.

VB.NET:
  1. Dim elemento As ListItem
  2. Dim cadena02 As String
  3. cadena02 = ""
  4. For Each elemento In c02.Items
  5.     If elemento.Selected Then
  6.         cadena02 = cadena02 & elemento.Value & "; "
  7.     End If
  8. Next

3 Comentarios

Cómo añadir JavaScript a un post de WordPress

Si quieres añadir un código de JavaScript a un post de WordPress, no puedes teclear el script directamente en el post porque WordPress le pondrá tags p en los saltos de línea y otras cosas.

Lo que tienes que hacer es colocar el script que contiene las funciones en un archivo con extensión .js y luego usar el cargador de archivos de WordPress para subir el archivo al servidor. Después añadelo al editor, solamente para copiar la liga. Una vez que tengas la liga, puedes añadir el script así (tecléalo tal cual dentro del cuerpo del post):

HTML:
  1. <script type="text/javascript" src="http://www.miblogwordpress.com/wp-content/uploads/2007/06/MisFunciones.js"></script>

Ahora puedes usar tus funciones, tecleálas tal cual dentro del cuerpo del post, por ejemplo:

HTML:
  1. <a href="javascript:FuncionEquis('Parametro1', 'Parametro2')">Ejecuta la función mediante una liga</a>

4 Comentarios

Script multinavegador para Agregar a Favoritos

Este es un script para Añadir a Favoritos que me encontré en DynamicDrive y que ya probé con Internet Explorer y Firefox.

Copia lo siguiente dentro del tag head de tu página web:

JavaScript:
  1. <script type="text/javascript">
  2.  
  3. /***********************************************
  4. * Bookmark site script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
  5. * This notice MUST stay intact for legal use
  6. * Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
  7. ***********************************************/
  8.  
  9. /* Modified to support Opera */
  10. function bookmarksite(title,url){
  11. if (window.sidebar) // firefox
  12.     window.sidebar.addPanel(title, url, "");
  13. else if(window.opera && window.print){ // opera
  14.     var elem = document.createElement('a');
  15.     elem.setAttribute('href',url);
  16.     elem.setAttribute('title',title);
  17.     elem.setAttribute('rel','sidebar');
  18.     elem.click();
  19. }
  20. else if(document.all)// ie
  21.     window.external.AddFavorite(url, title);
  22. }
  23. </script>

Puedes utilizar una porción de texto o una imagen y establece la liga de esta manera:

HTML:
  1. <a href="javascript:bookmarksite('Recursos Web', 'http://www.viale.com.mx')">Agregar este sitio a favoritos</a>

Pruébalo aquí:

Agregar este sitio a favoritos

No hay Comentarios

Como centrar una tabla con hojas de estilos

Antes que nada, esta manera de centrar una tabla dentro de una página ha quedado descontinuada:

HTML:
  1. <table align="center">

Los navegadores todavía lo soportan, pero la mejor manera de centrar una tabla es con hojas de estilos (CSS).

Te habrás dado cuenta de que si usas el siguiente código:

HTML:
  1. <div style="text-align:center">
  2.   <table border="1" width="150">
  3.     <tr>
  4.       <td> Hola </td>
  5.     </tr>
  6.   </table>
  7. </div>

la tabla se centra, pero también se centra todo su contenido!

Centrar tablas

Bueno, la manera de resolver esto es así:

Crea esta definición en tu hoja de estilos:

CSS:
  1. .TablaPrincipal
  2. {
  3.     width: 150px;
  4.     margin-left: auto;
  5.     margin-right: auto;
  6. }

Y ahora aplícasela a tu tabla:

HTML:
  1. <table class="TablaPrincipal">
  2.   <tr>
  3.     <td> Hola </td>
  4.   </tr>
  5. </table>

Se centra la tabla con respecto a la página, pero el texto dentro de la tabla no se centra.

Centrado de Tabla con CSS

¿Por qué?
Si te preguntas por qué ocurre esto, tendrías que referirte a la sección 10.3.3 de la especificación de las hojas de estilo, que dice:

If both 'margin-left' and 'margin-right' are 'auto', their used values are equal. This horizontally centers the element with respect to the edges of the containing block.

En español:

Si 'margin-left' y 'margin-right' se establecen a 'auto', los valores utilizados son iguales. Esto centra horizontalmente el elemento con respecto a los bordes del bloque contenedor.

1 Comentario

Cómo mostrar una leyenda cuando no hay registros en un DataList

El GridView tiene un template llamado EmtpyDataTemplate. Colocamos ahí un texto que diga: "No existen registros" y aparecerá cuando después del DataBind el GridView regrese vacío.

El DataList no cuenta con dicho template.

Para resolver este problema, simplemente coloca un Label al lado de tu DataList, como este:

ASP:
  1. <asp:Label ID="Mensaje" runat="server" CssClass="Validador" Text="No existen registros" Visible="False">

En mi ejemplo tengo unos DropDownLists que permiten elegir el mes y el año, y luego un Button que vuelve a hacer el DataBind para ver si se encontraron registros para la fecha elegida.

En el clic de ese Button tengo el código siguiente:

VB.NET:
  1. DataList1.DataBind()
  2. If DataList1.Items.Count = 0 Then
  3.     DataList1.Visible = False
  4.     Mensaje.Visible = True
  5. Else
  6.     DataList1.Visible = True
  7.     Mensaje.Visible = False
  8. End If

Listo, con eso haces que aparezca la leyenda "No hay registros" cuando el DataList se encuentre vacío.

No hay Comentarios

Encuentra un registro específico dentro de un DataList

Tengo un DataList como este:

ASP:
  1. <asp:DataList ID="DataList1" runat="server" DataSourceID="ObjectDataSource1" DataKeyField="idarticulo">
  2. <ItemTemplate>
  3.     <table>
  4.         <tr>
  5.             <td>
  6.                 <%# Eval("titulo") %>
  7.             </td>
  8.         </tr>
  9.         <tr>
  10.             <td>
  11.                 <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Download" CommandArgument="1"><%#Eval("aa1titulo")%></asp:LinkButton>
  12.                 <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Download" CommandArgument="2"><%#Eval("aa2titulo")%></asp:LinkButton>
  13.             </td>
  14.         </tr>                       
  15.     </table>   
  16. </ItemTemplate>
  17. </asp:DataList>

Nota:
aa1titulo y aa2titulo son títulos que guardo para mis archivos adjuntos 1 y 2.

La idea es que esos LinkButtons, al ser presionados, deben servir para que el usuario descargue unos archivos. En este ejemplo manejo dos archivos adjuntos para cada registro, por eso tengo dos LinkButtons.

Cuando se oprima alguno de esos LinkButtons, tengo que saber si se oprimió el primero o el segundo, para saber cuál de los dos archivos adjuntos enviar. También tengo que saber a cuál registro pertenece el LinkButton oprimido, para poder escoger el archivo adecuado.

Fíjate que a todos los LinkButtons les puse el CommandName establecido a Download. De esa manera voy a identificar que lo que se quiere hacer es una descarga. Ahora bien, a cada uno de ellos le establecí la propiedad CommandArgument a una distinta: 1 para el primer archivo adjunto y 2 para el segundo.

Con esto sabré si quieren descargar el primer archivo adjunto o el segundo. Ahora bien, suponiendo que en el DataList aparecerán n registros, ¿cómo voy a saber a cuál de los registros le hicieron clic en alguno de sus LinkButtons?

Nota que al DataList le he establecido la propiedad DataKeyField a idarticulo. Lo hice así porque la llave principal de mi tabla se llama idarticulo. Con esa llave encontraremos el registro al cual se le hizo clic.

Ok, ahora debes saber que el DataList tiene un evento que se llama ItemCommand, que se ejecuta precisamente cuando hagan clic en alguno de los LinkButtons. ¿Por qué? Porque les asigné la propiedad CommandName.

Entonces toda la operación la tenemos que hacer precisamente en ese evento, así:

VB.NET:
  1. Protected Sub DataList1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles DataList1.ItemCommand
  2.         If e.CommandName = "Download" Then
  3.             EmpujaArchivo(Me, DataList1.DataKeys(CType(e.Item.ItemIndex, Integer)), e.CommandArgument)
  4.         End If
  5. End Sub

Nota:
La función EmpujaArchivo simplemente envía el archivo utilizando Page.Response.WriteFile. El primer parámetro es la página como tal (por eso le estamos pasando Me), el segundo parámetro es el artículo en el cual se encuentra el archivo adjunto solicitado, y el tercer parámetro es cuál de los archivos adjuntos (1 ó 2) se debe enviar.

No hay Comentarios

Cómo borrar un archivo en asp.net 2

Antes que nada, recuerda importar System.IO:

VB.NET:
  1. Imports System.IO

Para eliminar el archivo haz lo siguiente:

VB.NET:
  1. Protected Sub aa1Borrar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles aa1Borrar.Click
  2.         Try
  3.             Dim RutaArch As String
  4.             RutaArch = MapPath(".") & "\archivo.doc"
  5.             Dim Archivo As FileInfo = New FileInfo(RutaArch)
  6.             If Archivo.Exists Then
  7.                 File.Delete(RutaArch)
  8.             Else
  9.                 Throw New FileNotFoundException()
  10.             End If
  11.  
  12.         Catch excepcion As FileNotFoundException
  13.             aa1Mensaje.Text += excepcion.Message
  14.  
  15.         Catch excepcion As Exception
  16.             aa1Mensaje.Text += excepcion.Message
  17.  
  18.         End Try
  19.  
  20.     End Sub

No hay Comentarios

Usando FindControl cuando tienes una MasterPage

Si estás tratando de usar FindControl para encontrar un control que está en una página que está basada en una MasterPage, utiliza la siguiente notación para encontrarlo:

Page.Master.FindControl("NombreDeLaForma").FindControl("NombreDelContentPlaceHolder").FindControl("ControlQueBuscas")

Ejemplo, supón que tu MasterPage es:

ASP:
  1. <%@ Master Language="VB" CodeFile="Ppal.master.vb" Inherits="Ppal" %>
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head runat="server">
  7.     <title>Titulo</title>
  8. </head>
  9. <body>
  10.     <form id="form1" runat="server">
  11.         <asp:contentplaceholder id="Cuerpo" runat="server">
  12.         </asp:contentplaceholder>
  13.     </form>
  14. </body>
  15. </html>

También supón que tienes una página basada en ese MasterPage, cuyo código es:

ASP:
  1. <%@ Page Language="VB" MasterPageFile="~/Ppal.master" AutoEventWireup="false" CodeFile="Ejemplo.aspx.vb" Inherits="Ejemplo" title="Untitled Page" %>
  2. <asp:Content ID="Content1" ContentPlaceHolderID="Cuerpo" Runat="Server">
  3.     <asp:TextBox ID="CajaTexto" runat="server"></asp:TextBox>
  4. </asp:Content>

El código que usarías para encontrar CajaTexto y modificar alguna de sus propiedades sería este:

VB.NET:
  1. Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  2.         Dim Caja As TextBox
  3.         Caja = Page.Master.FindControl("form1").FindControl("Cuerpo").FindControl("CajaTexto")
  4.         Caja.Text = "Hola"
  5.     End Sub

No hay Comentarios