c# asp.net vb.net

c# - ASP.NET-Common Gotchas



vb.net (21)

Cuando estoy trabajando con ASP.NET, descubro que siempre hay cosas inesperadas que encuentro que demoran una eternidad en depurarse. Me imagino que tener una lista consolidada de estos sería genial para esas circunstancias de "error extraño", además de ampliar nuestro conocimiento de la rareza en la plataforma.

Entonces: ¡responde con uno de tus "Gotcha" s!

Comenzaré: en ASP.NET (VB), realizar un Response.Redirect dentro de un bloque try / catch no detiene la ejecución de la respuesta actual, lo que puede llevar a la ejecución de dos respuestas concurrentes contra la misma sesión.


(VB.NET) Si envía un Objeto a través de los accesos de Get de una Propiedad a una función con una palabra clave ByRef, en realidad intentará actualizar el objeto usando el Accesador de Conjunto para la Propiedad.

Ex:

UpdateName(ByRef aName as String)

UpdateName(Employee.Name) intentará actualizar el nombre utilizando la propiedad Establecer en el nombre del empleado.



Desconocer montones de funcionalidades existentes y extensibles en el marco. Las cosas que se renuevan a menudo son membresía, roles, autorización, mapas del sitio. Luego están los controles y las etiquetas asociadas que se pueden personalizar para aliviar los problemas con los ID de los clientes, entre otros. También cosas simples como no saber utilizar correctamente el archivo .config para auto importar espacios de nombres en plantillas, y poder hacer eso en una base de directorio. Cosas menos conocidas como expresiones de etiquetas también pueden ser valiosas en ocasiones. Sin duda, al igual que con todos los marcos, existe una curva de aprendizaje y siempre hay algo que se desea desear, sin embargo, en la mayoría de los casos, es mejor personalizar y ampliar un marco existente en lugar de hacer el suyo propio.


El ciclo de vida de los controles personalizados no coincide perfectamente con los eventos del mismo ciclo de ciclo de vida de la página.


Esto lo aprendí hoy: el método Bind (), como se usa con GridViews y ListViews, no existe. De hecho, está ocultando algo de magia Reflector que lo convierte en un Eval () y algún tipo de asignación de variable.

El resultado de esto es que llamadas como:

<%# FormatNameHelper(Bind("Name")) %>

ese aspecto perfectamente válido fracasará. Vea esta publicación en el blog para más detalles.


Haciendo un control similar a un repetidor, y sin saber acerca de INamingContainer .


La depuración es una característica muy interesante de ASP.Net, pero tan pronto como cambie algún código en la carpeta app_code, activará una nueva construcción de la aplicación, lo que provocará la pérdida de todas las sesiones.

Esto puede ser muy molesto al depurar un sitio web, pero puede evitarlo fácilmente usando el " modo StateServer ": es solo un servicio para iniciar y una línea para cambiar en el archivo web.config: consulte msdn: http: // msdn. microsoft.com/en-us/library/ms178586.aspx

  1. Modo InProc , que almacena el estado de la sesión en la memoria en el servidor web. Este es el predeterminado .
  2. Modo StateServer , que almacena el estado de la sesión en un proceso separado denominado servicio de estado ASP.NET. Esto garantiza que se preserve el estado de la sesión si se reinicia la aplicación web y también hace que el estado de la sesión esté disponible para múltiples servidores web en una granja de servidores web.
  3. Servidor SQL ...
  4. Personalizado ...
  5. ¡Apagado!

Linq: si está utilizando Linq-To-SQL, llama a SubmitChanges() en el contexto de datos y arroja una excepción (por ejemplo, clave duplicada u otra violación de restricción), los valores ofensivos del objeto permanecen en su memoria mientras está depurando, y se volverán a enviar cada vez que posteriormente llame a SubmitChanges() .

Ahora, aquí está el verdadero truco: ¡los malos valores permanecerán en la memoria incluso si presiona el botón "detener" en su IDE y se reinicia! No entiendo por qué alguien pensó que era una buena idea, pero ese pequeño ícono de ASP.NET que aparece en la bandeja de tu sistema se mantiene en ejecución, y parece que guarda tu caché de objetos. Si quiere vaciar el espacio de su memoria, tiene que hacer clic con el botón derecho sobre ese icono y cerrarlo forzosamente. GOTCHA!


Los controles de datos dentro de un control INamingContainer no se deben colocar dentro de controles con plantillas, como FormView. Vea este informe de error para un ejemplo. Como los controles INamingContainer crean su propio espacio de nombres para sus controles contenidos, el enlace de datos bidireccional utilizando Bind () no funcionará correctamente. Pero al cargar los valores, todo se verá bien (porque está hecho con Eval ()), no es antes de intentar publicar los valores que misteriosamente parecerán no aterrizar en la base de datos.

Esta pregunta así demuestra bien el problema: Tabcontainer AJAX dentro de formview no inserta valores


Los controles personalizados solo son compatibles con el diseñador al crear el control o al crear la página que usa el control, pero no con ambos.


No agregue controles dinámicamente después del evento de inicio de página, ya que arruinará el árbol viewstate.


No edite su web.config con el bloc de notas si tiene caracteres acentuados, lo reemplazará por uno con la codificación incorrecta. Se verá igual sin embargo. Solo tu aplicación no se ejecutará.


No es una cosa pura de ASP.NET, pero ...

Estaba tratando de usar una cláusula SELECT o b) WITH WITH y simplemente no podía hacer que funcionara, pero las personas que obviamente estaban más informadas (incluyendo a alguien con quien yo trabajaba) me dijeron que la sintaxis estaba bien. Se apaga ...

No se pudo usar ninguno de los que tienen OLEDB.

La consulta OLEDB a SQL Server falla

(Además, me recibió la respuesta. Directirect () en la función try ... catch ''mencionada en el OP! ¡Gran hilo!)


No se puede hacer referencia a nada sobre la carpeta raíz de la aplicación.


Page_Load se ejecuta antes que controladores de control. Por lo tanto, no puede realizar cambios en un controlador de eventos y luego usar esos cambios en la carga de la página. Esto se convierte en un problema cuando tiene controles en una página maestra (como un control de inicio de sesión). Puede solucionar el problema redireccionando, pero definitivamente es un problema.


Si está ejecutando aplicaciones Classic ASP en el mismo directorio virtual que su aplicación ASP.Net, el primer golpe en la aplicación debe estar en una página ASP.Net. Esto asegurará que la AppPool se construya con las configuraciones de contexto correctas. Si la primera página para ser golpeada es una página ASP clásica, los resultados pueden variar de una aplicación a otra. En general, el AppPool está configurado para usar el último marco.


Tener que pasar por aros para obtener la propiedad .ClientID en javascript.

Sería bueno si la fase de renderización del ciclo de vida creara un script que configurara una var para cada control de servidor con el mismo nombre que el control que se inicializó automáticamente en el valor de clientID. O tal vez tenga alguna manera de desencadenar fácilmente esta acción.

Hmm ... apuesto a que podría establecer un método para esto solo a través de la reflexión.


Todo el código que tengo que mantener que todavía parece que estaba escrito en vb6, muestra una completa ignorancia de los estilos más nuevos.

Estoy hablando de cosas como CreateObject (), excesivos bloques <%%>, y / o en lugar de AndAlso / OrElse, Len () en lugar de .Length (), s / o verrugas de prefijo húngaro, Dim MyVariable sin tipo, funciones sin tipo de devolución ... podría continuar.


Todo el ciclo de vida en general.

No es que yo vea nada malo en eso, es solo que te sorprendería la cantidad de personas que comienzan a trabajar en grandes proyectos de ASP.Net antes de entenderlo, en lugar de viceversa. Por lo tanto, se convierte en una gotcha.

Tenga en cuenta que dije grandes proyectos: creo que la mejor manera de llegar a un acuerdo con el ciclo de vida es trabajar primero en algunos proyectos más pequeños, donde no importa tanto si los arruina.


Viewstate ... si lo está usando ... puede perder el control si no le presta atención.


  • Debe preocuparse por los tiempos de espera de la sesión para las aplicaciones en las que el usuario podría demorar mucho tiempo.

  • También debe preocuparse de cargar tiempos de espera para aplicaciones grandes, también

  • Es posible que los Validadores no siempre desplace su página a la escena del error de ingreso de datos (para que el usuario no la vea nunca y solo se preguntará por qué el botón de envío no funcionará)

  • Si el usuario ingresa símbolos HTML como < , > (por ejemplo, P > 3.14 ) o un elemento inadvertido al copiar y pegar en otra página, ASP.NET rechazará la página y mostrará un error.

  • null.ToString() produce un gran error gordo. Verifique cuidadosamente.

  • El uso compartido de grupos de sesión en varias aplicaciones es un desastre que espera a que suceda silenciosamente

  • Mover aplicaciones en máquinas con diferentes entornos es una migraña que involucra a web.config y muchas horas potenciales de google

  • ASP.NET y MySQL son propensos a problemas de almacenamiento en caché si utiliza procedimientos almacenados

  • AJAX puede hacer un desastre, también:

    • Hay situaciones en las que el cliente puede omitir la validación de la página (especialmente presionando ENTER en lugar de presionar el botón de enviar). Puede solucionarlo llamando a if(! Page.IsValid) { return ; } if(! Page.IsValid) { return ; }
    • Los botones ASP generalmente no funcionan correctamente dentro de UpdatePanels
    • Cuantos más contenidos haya en su UpdatePanel, más datos se transmiten de forma asíncrona, por lo que tarda más tiempo en cargarse
    • Si su panel AJAX tiene un problema o error de algún tipo, se "bloquea" y ya no responde a los eventos en su interior.