Todos los valores proporcionados cuando el usuario completa el contenido de la página <FORM>, o ingresa el valor después de la URL en la barra de direcciones del navegador, son utilizados por el script ASP a través de las colecciones Form y QueryString. Esta es una forma sencilla de acceder a valores en código ASP.
1. Técnicas generales para acceder a colecciones ASP.
La mayoría de las colecciones ASP son similares a las colecciones ordinarias que se ven en VB. Efectivamente, son matrices de valores, pero se accede a ellas mediante una clave de cadena de texto (que no depende del tamaño) y un índice entero. Por lo tanto, si la página web del cliente contiene el <FORM> de la siguiente manera:
<FORM ACTION="show_request.asp" METHOD="POST">
Nombre:<TIPO DE ENTRADA=”TEXTO” NOMBRE=”Nombre”>
Apellido:<TIPO DE ENTRADA=”TEXTO” NOMBRE=”Apellido”>
<TIPO DE ENTRADA=”ENVIAR” VALOR=”Enviar”>
</FORM>
Puede acceder al valor en su control accediendo a la colección de formularios de ASP:
strFirstName = Request.Form("FirstName")
strLastName = Request.Form("LastName")
también puede usar el índice entero de los controles en el formulario. El rango del índice comienza desde el primer control definido en el HTML y luego se ordena según el orden de definición:
strFirstName =. Solicitud.Formulario( 1)
strLastName = Request.Form(2)
Sin embargo, no se recomienda esta última técnica de usar indexación de enteros, porque una vez que cambia el control en el HTML o se inserta un nuevo control, el código ASP obtendrá el valor incorrecto. Además, resulta extremadamente confuso para las personas que leen el código.
1) Para acceder a todos los valores de la colección,
puede convertir una serie de valores en todo el formulario en una variable de un solo carácter haciendo referencia a la colección sin proporcionar una clave o índice.
StrAllFormContent = Request.Form
Si el cuadro de texto contiene los valores Priscilla y Descartes, la declaración Request.Form devolverá los siguientes caracteres:
FirstName=Priscilla&LastName=Descartes
Tenga en cuenta que los valores proporcionados aparecen en forma de pares de nombre/valor (es decir, Nombre de control = Valor de control), y cada par de nombre/valor está separado entre sí por el símbolo "&". Esta técnica es útil si planea pasar el contenido del formulario a una aplicación ejecutable o DLL separada que espera que los valores estén en un formato estándar. Sin embargo, en términos generales, se accede al contenido de una colección utilizando el nombre del control en el formulario como clave de texto.
2) Atravesar una colección ASP
Hay dos formas de atravesar todos los miembros de una colección ASP. Los métodos son básicamente los mismos que los de las colecciones VB normales. Cada colección proporciona una propiedad Count, que devuelve el número de elementos de la colección. Se puede recorrer utilizando la propiedad Count utilizando un índice entero.
Para intLoop=1 Para Request.Form.Count
Respuesta.Solicitud de escritura.Form(intLoop) & “<BR>”
SiguienteSi
el formulario anterior contiene dos cuadros de texto con los valores de Priscilla y Descartes, obtendrás los siguientes resultados:
Priscilla
Descartes
Sin embargo, un mejor enfoque es utilizar la estructura Para cada...Siguiente.
Para cada objItem en Request.Form
Respuesta.Escribir objItem & “=" & Request.Form(objItem) & “<BR>”
SiguienteLa
ventaja de esto es que puede acceder tanto al nombre como al valor del control. El código anterior dará como resultado lo siguiente:
Nombre = Priscilla
Apellido = Descartes
Tenga en cuenta que los valores <FORM> devueltos por algunos navegadores a ASP pueden no ser el mismo que el orden que se muestra en la página.
3) Naturaleza de valores múltiples de los miembros de la colección
En algunos casos, cada miembro de la colección ASP puede tener más de un valor. Esto sucede cuando hay varios controles en la definición HTML que tienen el mismo atributo de Nombre. Por ejemplo:
<FORM ACTION=”Show_request.asp” METHOD=”POST”>
<TIPO DE ENTRADA=”TEXTO” NOMBRE=”Otro Hobby”>
<TIPO DE ENTRADA=”TEXTO” NOMBRE=”Otro Hobby”>
<TIPO DE ENTRADA=”TEXTO” NOMBRE=”Otro Hobby”>
<TIPO DE ENTRADA=”ENVIAR” VALOR=”Enviar”>
</FORM>
En la colección Formulario, se creará una entrada para "Otro Hobby". Sin embargo, incluirá los valores de los tres cuadros de texto. Si el usuario deja uno o más campos en blanco al enviar, el valor devuelto es una cadena vacía. Si el usuario ingresa Jardinería y Montañismo en el primer y tercer cuadro de texto respectivamente, y el segundo cuadro de texto está vacío, al acceder a Request.Form("OtherHobby") en nuestro código ASP se devolverá la cadena:
Jardinería, Montañismo
Para poder acceder a un valor único en este caso, puede utilizar un código más complejo:
For Each objItem In Request.Form
Si Request.Form(objItem).Count >1 Entonces 'Más de un valor en este elemento Response.Write objItem & “:<BR>”
Para intLoop = 1 Para Request.Form(objItem).Count
Respuesta.Escribir “Subclave” & intLoop & “valor = “& Request.Form(objItem) (intLoop) & “<BR>”
Próximo
Demás
Respuesta.Escribir objItem & “ = ” & Request.Form(objItem) & “<BR>”
Terminar si
SiguientePara
la instancia de formulario anterior que contiene tres controles OtroHobby, esto devolvería:
OtroHobby:
Valor de la subclave 1 = Jardinería
Valor de la subclave 2 =
Valor de la subclave 3 = Montañismo
Sin embargo, dado que es raro dar el mismo nombre a varios cuadros de texto, esta técnica rara vez se utiliza.
a) Controles de botones de radio o de página en HTML
En HTML, la situación en la que a varios controles se les debe dar el mismo atributo de nombre es el botón de radio (u opción), por ejemplo:
<FORM ACTION="show_request.asp" METHOD=" POST ”>
Vivo en:
<TIPO DE ENTRADA=”RADIO” NOMBRE=”País” VALOR=”AM”>América<BR>
<TIPO DE ENTRADA=”RADIO” NOMBRE=”País” VALOR=”UE”>Europa<BR>
<TIPO DE ENTRADA=”RADIO” NOMBRE=”País” VALOR=”AS”>Asia<BR>
<TIPO DE ENTRADA=”ENVIAR” VALOR=”Enviar”>
</FORM>
Debido a que el usuario solo puede seleccionar uno de los múltiples elementos (razón por la cual reciben el mismo nombre), solo se obtendrá un valor de retorno y el navegador solo puede enviar el valor del control seleccionado. Por lo tanto, si el usuario de este formulario ha seleccionado "Europez", se obtendrá esta entrada, y su valor se obtendrá atravesando el conjunto del Formulario:
País = UE
Dado que se proporciona un atributo VALOR diferente para cada control, refleja el valor correspondiente a cada entrada. El nombre del país o región. Si se omite el atributo VALUE, el navegador devolverá el valor "on", por lo que obtendrá:
País = on
Esto no se usa con frecuencia, por lo que el atributo VALUE se usa generalmente para controles de radio con el mismo nombre.
b) Control de casilla de verificación HTML
Cuando el código fuente HTML de un formulario contiene un control de casilla de verificación, generalmente se le asigna un nombre único, por ejemplo:
<FORM ACTION="show_request.asp" METHOD="POST">
Disfruto:
<INPUT TYPE=”CHECKBOX” NAME=”Lectura” COMPROBADO> Lectura
<INPUT TYPE=”CHECKBOX” NAME=”Comer”>Comer
<INPUT TYPE=”CHECKBOX” NAME=”Durmiendo”> Durmiendo
<TIPO DE ENTRADA=”ENVIAR” VALOR=”Enviar”>
</FORM>
En este caso, al enviar el formulario, si solo se seleccionan (marcan) la primera y tercera casilla de verificación, al recorrer la colección de Formularios se obtendrán los siguientes valores:
Lectura = activado
Sleeping = on
Sin embargo, si proporciona un valor para cada casilla de verificación, este valor se envía al servidor en lugar de la cadena "on". Por ejemplo, el formulario es el siguiente:
<FORM ACTION="show_request.asp" METHOD="POST">
Disfruto:
<TIPO DE ENTRADA=”CHECKBOX” VALOR=”Hobby025” NOMBRE=”Hobby” COMPROBADO>_
Nadar
<TIPO DE ENTRADA=”CHECKBOX” VALOR=”Hobby003” NOMBRE=”Hobby” COMPROBADO>_
Lectura
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby068” NAME=”Hobby”>Comer
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby010” NOMBRE=”Hobby”>Dormir
<TIPO DE ENTRADA=”ENVIAR” VALOR=”Enviar”>
</FORM>
Si se envían todas las casillas de verificación excepto la tercera, la colección Request.Form producirá los siguientes resultados:
Hobby = Hobby025, Hobby003, Hobby010
Si escribe un código transversal de colección más complejo, como se mencionó anteriormente (se muestra por separado cada subclave) , obtienes el resultado:
Hobby:
Valor de la subclave 1 = Hobby025
Valor de la subclave 2 = Hobby003
Valor de la subclave 3 = Hobby010
Cabe señalar que en dos casos, el control no seleccionado no devuelve ningún valor. En el resultado del primer caso, no hay comas engañosas y no hay valores nulos en el segundo caso. Esto es diferente de los resultados de la prueba equivalente que utiliza cuadros de texto descritos anteriormente. Cuando se utilizan cuadros de texto, cada cuadro de texto devuelve un valor, incluso una cadena vacía. Esto es causado por el navegador. Por lo tanto, debes prestar atención a este problema al acceder a colecciones en código ASP.
Un efecto secundario complicado de la situación anterior es que cuando se utilizan casillas de verificación, el índice del valor de la casilla de verificación no tiene relación con la posición del control en el HTML original. En el ejemplo anterior, la cuarta casilla de verificación tiene un número de subclave de 3. porque cuando se envía el formulario, el segundo control no está seleccionado.
c) Control de lista HTML
La etiqueta <SELECT> en HTML se utiliza para generar un cuadro de lista desplegable estándar, cuyos valores se representan de una forma híbrida interesante. El siguiente formulario se crea con 5 valores para que el usuario seleccione. Dado que contiene el atributo MÚLTIPLE, es posible seleccionar más de una entrada manteniendo presionada la tecla Shift o Ctrl mientras selecciona.
<FORM ACCIÓN=”show_request.asp” MÉTODO=”POST”>
<SELECCIONAR NOMBRE=”Hobby” TAMAÑO=”5” MÚLTIPLE>
<OPCIÓN VALOR=”Hobby001”>Programación</OPCIÓN>
<OPCIÓN VALOR=”Hobby025”>Natación</OPCIÓN>
<OPCIÓN VALOR=”Hobby003”>Lectura</OPCIÓN>
<OPCIÓN VALOR=”Hobby068”>Comer</OPCIÓN>
<OPCIÓN VALOR=”Hobby010”>Dormir</OPCIÓN>
</SELECCIONAR><P>
<TIPO DE ENTRADA=”ENVIAR” VALOR=”Enviar”>
</FORM>
devuelve una única entrada en la colección Form, que contiene los valores seleccionados (el atributo VALUE especificado en una única etiqueta <OPTION>), separados por comas:
Hobby = Hobby025, Hobby003, Hobby010
if Usando un código transversal de conjunto un poco más complejo (que muestra cada subclave individualmente), obtenemos:
Hobby:
Valor de la subclave 1 = Hobby025
Valor de la subclave 2 = Hobby003
Valor de la subclave 3 = Hobby010
Esta es la misma situación que la anterior para la casilla de verificación con el mismo nombre. De hecho, una lista SELECT puede considerarse como una lista de casillas de verificación para seleccionar (no marcar) los elementos correspondientes.
Sin embargo, el cuadro de lista también tiene un valor especificado. Si configura el atributo VALOR en la etiqueta <OPCIÓN>, obtendrá el contenido de texto de la opción seleccionada. El conjunto Request.Form contendrá dicho elemento:
Hobby = Natación. Leer, dormir
y, del mismo modo, un código de iteración de colección más complejo arrojaría resultados como este:
Hobby:
Valor de la subclave 1 = Natación
Valor de la subclave 2 = Lectura
Valor de la subclave 3 = Dormir
Por supuesto, si se selecciona un solo elemento y se proporciona el atributo VALOR en <OPCIÓN>, el resultado solo contendrá:
Hobby = Hobby025.
Si no se proporciona el atributo VALOR, el resultado será:
Hobby = Hobby025. Natación.
Esto permite que falte Provincial (es decir, sin VALOR) muestra el texto de la opción y también puede realizar los cambios correspondientes. El último caso es extremadamente útil en determinadas situaciones, como cuando desea mostrar (una cadena descriptiva) y pasar un contenido completamente diferente (como usar un código corto para representar una cadena descriptiva).
d) Las casillas de verificación de controles de imagen y envío de HTML
y los botones de opción son ejemplos de controles booleanos que devuelven "activado" cuando se marcan o seleccionan. A diferencia de los cuadros de texto y la mayoría de los demás controles HTML, los navegadores no incluyen controles no marcados o seleccionados. no seleccionado.
Hay otro control booleano de uso común llamado botón HTML. Como los tipos <INPUT TYPE="SUBMIT">, <INPUT TYPE="RESET">, <INPUT TYPE="IMAGE">, <INPUT TYPE="BUTTON"> y <BUTTON>...</BUTTON>.
Los controles de tipo BOTÓN no devuelven ningún valor porque no tienen ningún impacto directo en el formulario. Incluso si utiliza el método Enviar utilizado para llamar al formulario, el navegador no incluirá el valor del control de tipo BOTÓN en ninguna solicitud. Del mismo modo, el valor de un botón <INPUT TYPE="RESET"> nunca se envía al servidor.
Sin embargo, los controles de botón de entrada de tipo ENVIAR e IMAGEN en realidad envían el formulario al servidor, y sus propiedades VALOR contienen los valores de los otros controles del formulario (siempre que se incluya un atributo NOMBRE en la definición HTML). Por ejemplo, este formulario podría ser parte de una aplicación web de tipo asistente que permite al usuario recorrer o cancelar un proceso:
<FORM ACTION="show_request.asp" METHOD="POST">
<TIPO DE ENTRADA=”ENVIAR” NOMBRE=”btnSubmit” VALOR=”Siguiente”>
<TIPO DE ENTRADA=”ENVIAR” NOMBRE=”btnSubmit” VALOR=”Anterior”>
<TIPO DE ENTRADA=”SUBIMT” NOMBRE=”btnSubmit” VALOR=”Cancelar”>
</FORMULARIO>
En un formulario, puede incluir varios botones ENVIAR. En este caso, a cada botón se le debe asignar un atributo VALOR único, como se muestra arriba. Cuando se envía un formulario, recorrer los valores de la colección Request.Form producirá un valor que depende del botón que se presionó para enviar el formulario. Si el usuario presiona el botón "Anterior", obtendrá:
btnSubmit = Anterior.
Por lo tanto, se puede consultar la colección Request.Form para determinar la siguiente página mostrada, por ejemplo:
Select Case Request.Form("btnSubmit")
Caso "Siguiente"
Respuesta.Redireccionamiento "página_3.asp"
Caso "Anterior"
Respuesta.Redireccionamiento "página_1.asp"
Caso "Cancelar"
Respuesta.Redireccionamiento "main_menu.asp"
Finalizar selección
Al mismo tiempo, también puede utilizar diferentes atributos de NOMBRE para cada botón según sea necesario. Y seleccione el nombre del control cuyo valor está contenido en la colección Form. Extremadamente útil en situaciones donde el control no tiene un marcado completo sino que va seguido de una etiqueta de texto más larga, como se muestra en la imagen a continuación.
La interfaz de esta pantalla se genera mediante el siguiente código:
<FORM ACTION="show_request.asp" METHOD="POST">
<B>¿Qué quieres hacer ahora?</B><P>
<INPUT TYPE=”SUBMIT” NAME=”btnNext” VALUE= ”>Ir a la página siguiente<P>
<INPUT TYPE=”SUBMIT” NAME=”btnPrevious” Value=” ”> VOLVER a la página anterior<P>
<INPUT TYPE=”SUBMIT” NAME=”btnCancel” VALUE=” ”>Cancelar y volver a la página del menú principal<P>
</FORM>
En la página ASP, después de recibir los datos, puede verificar el valor proporcionado por el nombre del botón para determinar qué botón se presionó.
Si Len(Request.Form(“btnNext”)) Entonces Response.Redirect “page_3.asp”
Si Len(Request.Form(“btnPrevious”)) Entonces Response.Redirect “page_1.asp”
Si Len(Request.Form("btnCancel")) Then Response.Redirect "main_menu.asp"
Este trabajo consiste en consultar la colección ASP en una clave y devolver una cadena vacía si no existe. En otras palabras, si se presiona el segundo botón (página anterior), el valor de Request.Form("btnNext") es una cadena vacía y su longitud es cero sin generar error. Cuando se presiona el segundo botón, el valor de esta entrada en la colección de formularios, Request.Form("btnPrevious"), será " " y su longitud será mayor que cero.
e) Mejorar la eficiencia del uso de la colección Request
Acceder a una colección ASP para descargar un valor es un proceso que consume mucho tiempo y requiere mucho cálculo porque la operación implica una serie de búsquedas de colecciones relacionadas, lo cual es mucho más lento que acceder a una variable local. Por lo tanto, si planea utilizar un valor de la colección varias veces en la página, debería considerar almacenarlo como una variable local, por ejemplo:
strTitle = Request.Form("Title")
strFirstName = Solicitud.Form("FirstName")
strApellido = Solicitud.Form("Apellido")
Si Len(stTitle) Entonces strTitle = strTitle & “ “
Si strFirstName = " " Entonces
StrFullName = strTitle & " " & strApellido
De lo contrario, Len (strFirstName) = 1 Entonces
StrFullName = strTitle & strFirstName & “· “ & strApellido
Demás
StrFullName = strTitle & strFirstName & " " & strApellido
End If
f) Buscar en todas las colecciones de Request
En algunos casos, es posible saber que el nombre clave de un valor aparecerá en la colección de Request, pero no exactamente qué colección es. Por ejemplo, si varias páginas (o diferentes secciones de una página) envían un valor al mismo script ASP, puede aparecer en la colección Form o QueryString.
Para ver por qué un valor puede aparecer en diferentes colecciones, considere esta situación: se solicita una página utilizando el elemento de hipervínculo <A>. En este caso, la única forma de agregar un valor a la solicitud es agregarlo a la URL. Sin embargo, es posible que el mismo valor ya aparezca en un <FORM> en otra página, o en una parte diferente de la misma página:
...
<FORM ACCIÓN=”process_page.asp” MÉTODO=”POST”>
<TIPO DE ENTRADA=”ENVIAR” NOMBRE=”página” VALOR=”Siguiente”>
<TIPO DE ENTRADA=”ENVIAR” NOMBRE=”página” VALOR=”Anterior”>
<TIPO DE ENTRADA=”ENVIAR” NOMBRE=”página” VALOR=”Ayuda”>
</FORMULARIO>
...
...
Para obtener ayuda, vaya a <A HREF=”process_page.asp?page=Help”>Página de ayuda</A>
...
En este caso, al presionar el botón Ayuda en el formulario se enviará el par nombre/valor "página=Ayuda" de la colección Request.Form. Sin embargo, al presionar el hipervínculo <A> también se puede enviar el nombre/valor "Página=Ayuda", pero esta vez en la colección QueryString. Para acceder a este valor, utilice una característica especial del objeto Solicitud ASP:
strPage = Request("page")
Esto buscará en toda la colección (QueryString, Form, Cookies, ClientCertificate, ServerVariables) en orden, hasta que se encuentre el nombre del primer valor coincidente. Hacerlo es menos eficiente que acceder directamente a la colección apropiada y no es seguro a menos que exista una garantía absoluta de que el valor no aparecerá en otra colección.
Por ejemplo, es posible que desee recopilar el nombre del servidor web que cumple con la solicitud de un cliente buscando "SERVER_NAME" en la colección Request.ServerVariables que aparece en cada consulta. Sin embargo, si cualquier otra colección también contiene un valor denominado "nombre_servidor" (recuerde que los nombres de las claves no distinguen entre mayúsculas y minúsculas), obtendrá resultados incorrectos al utilizar Solicitud ("nombre_servidor"). Usando la sintaxis Reqeust.ServerVariables("server_name"), tendremos dificultades para rastrear errores.
En resumen, utilice la técnica de "buscar en toda la colección" con extrema precaución y sólo cuando ninguna otra técnica le proporcione los resultados que necesita.
g) Acceder a otras colecciones
En este apartado de este artículo nos hemos centrado en la colección Form, que es probablemente la más utilizada. Sin embargo, todas estas técnicas son igualmente aplicables a otros objetos. Incluyendo las proporcionadas por las colecciones del objeto Solicitud (es decir, Formulario, QueryString, Cookies, ServerVariables y ClientCertificate) y las cookies (y colecciones proporcionadas por otros objetos) proporcionadas por el objeto Respuesta.
Analizaremos brevemente cómo se ingresa un valor en una colección QueryString, junto con sus ventajas y desventajas. Sin embargo, ambos conjuntos de cookies tienen funciones adicionales que hacen que el uso de cookies sea más conveniente, como se analiza a continuación.