Es incorrecto utilizar una sección registrada como allowDefinition=’MachineToApplication’ mas allá del nivel de aplicación

Al tratar de compilar (Build) una aplicación de ASP.NET 2 aparece el siguiente error:

Error 1 Es incorrecto utilizar una sección registrada como allowDefinition='MachineToApplication' mas allá del nivel de aplicación. Este error puede tener como origen un directorio virtual que no esté configurado como aplicación en IIS. W:AmexCuestionarioClubVacacionesserverWeb.config 87

En inglés:

Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

En mi caso esto se debía a que tenía un archivo web.config dentro de una subcarpeta de la aplicación raíz. Estaba guardando ese archivo como backup, y era lo que impedía que el proyecto se compilara, marcando el error anterior.

Tan pronto como lo renombré a web.config.txt desapareció el error.

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:MiAplicacionweb.config line 46) W:MiAplicacionAdminDefault.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 servidoraplicacion.

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.

Formatear una fecha dentro de un GridView usando DataFormatString

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

  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:

  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

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:

  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.

  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

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:

  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:

  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.