2008-09-15 13 views
14

Cuando estoy trabajando con ASP.NET, encuentro 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.ASP.NET - Común Gotchas

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

Voy a 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 conducir a dos respuestas simultáneas en la misma sesión .

+4

Debería mover el ejemplo de una respuesta –

+0

creo que esto debería ser una comunidad wiki –

+0

dangit! ¡Ojalá hubiera visto esto hace unas semanas! Me atrapó esa misma cosa. – elbillaf

Respuesta

6

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

21

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

+0

+1 ¡Gracias, buen consejo! –

3

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á.

+0

IME, el problema es que inserta una lista de materiales al comienzo del archivo. Correcto para los archivos .aspx, pero incorrecto para web.config (los documentos XML no deben comenzar con una lista de materiales). – finnw

8

Viewstate ... si lo está usando ... puede salirse de control si no le está prestando atención.

+0

Viewstate está bien para los cambios realizados en los controles por parte del usuario. Es cuando los cambios realizados por su código comienzan a hacer su camino allí que tiene un problema. –

+0

Estoy de acuerdo ... es algo que desea vigilar ... ya que es propenso al descuido. – mattruma

0

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

+0

Esa es una característica de seguridad. De lo contrario, el código malicioso, por ejemplo en un servidor compartido, podría explorar toda la unidad. – MatthewMartin

0

Todo el código que tengo que mantener que aún parece que estaba escrito en vb6, muestra un completo desconocimiento de los estilos más nuevos.

Estoy hablando cosas como CreateObject(), excesivo <%%> blocks, Y/O en lugar de AndAlso/OrElse, Len() en lugar de .Length(), s/o verrugas de prefijo húngaro, Dim MyVariable con sin tipo, funciones sin tipo de retorno ... Podría continuar.

1

Los controles personalizados solo son compatibles con el diseñador al construir el control o cuando se crea la página que utiliza el control, pero no ambos.

4

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.

+1

ODIO esto. Gracias a Dios que el framework MVC lo hace innecesario. –

+0

Al menos en VB.NET, tiene la opción de usar delimitadores ASP clásicos para realizar el trabajo. No es bonito, pero funciona: función jsFunction() { var someElement = document.getElementById (<% = SomeControl.ClientId%>); ... } –

+1

No lo pondría directamente en una llamada .getElementById(). Prefiero tener un script global cerca de la parte superior, donde cada control que uso tiene su propia var, definida una vez, con el clientID configurado como el valor. Ahorrarían un montón de problemas si solo hicieran ese estándar. –

-5

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

Ex:

UpdateName(ByRef aName as String)

UpdateName(Employee.Name) intentará actualizar el nombre utilizando el aparato sobre la propiedad Nombre del empleado.

+3

Eso es bueno, como debería ser. –

7

Todo el ciclo de vida en general.

No es que yo veo nada de malo, es sólo que usted se sorprenderá de la cantidad de personas que comienzan a trabajar en grandes proyectos ASP.Net antes de entenderlo, y no al revés. Por lo tanto, se convierte en una gotcha.

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

+0

+1 Esto es cierto en general.Voy un paso más allá y recomiendo que se queden para sentir el dolor de sus decisiones de diseño/codificación. –

+0

Vamos a ir a leer sobre esto ahora mismo. – elbillaf

3

acabo de aprender esto hoy en día: 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 las llamadas como:

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

que se ven perfectamente válido fallará. Vea this blog post para más detalles.

5

Page_Load se ejecuta antes de los 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.

1

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

Ahora aquí está la verdadera bueno: los malos valores permanecerán en la memoria incluso si se presiona el botón "stop" en su IDE y reiniciar! 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 permanece 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!

+0

Esto huele a abusar de su DataContext (extendiendo su vida más allá de para lo que fue diseñado). Además, intente habilitar Editar-y-Continuar. – ErikHeemskerk

2

Si está ejecutando aplicaciones ASP clásico en el mismo directorio virtual a medida que la aplicación ASP.Net, el puño golpeó en la aplicación debe estar en una página de 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.

2

Hacer un control del repetidor similar, y no saber acerca INamingContainer.

0

Desconfíe de 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.

3

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

Esto puede ser muy molesto durante la depuración de un sitio web, pero se puede prevenir fácilmente esto usando el "modo de StateServer": es sólo un servicio para comenzar y una línea para cambiar en el web.config: referirse a MSDN : http://msdn.microsoft.com/en-us/library/ms178586.aspx

  1. modo InProc, que almacena el estado de sesión en la memoria en el servidor web. Este es el valor predeterminado.
  2. modo StateServer, que almacena el estado de la sesión en un proceso separado llamado estado ASP.NET servicio. Esto garantiza que el estado de la sesión se conserve 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. SQL Server ...
  4. personalizado ...
  5. Off!
+0

Puede crear una aplicación web en lugar de un sitio web, lo que alivia muchos de estos problemas. – ErikHeemskerk

2
  • usted tiene que preocuparse acerca de session timeouts para aplicaciones donde el usuario podría tardar mucho tiempo.

  • También tiene que preocuparse de uploading timeouts para aplicaciones de gran tamaño, también

  • Validatiors no siempre puede desplazarse a su página a la escena del error de entrada de datos (por lo que el usuario no podrá ver nunca y sólo se preguntará ¿por qué el botón de envío no funcionará)

  • Si el usuario introduce los símbolos HTML, como <, > (por ejemplo, P > 3.14), o un inadvertant <br> de copiar y pegar en otra página, ASP.NET will reject the page y mostrará un error.

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

  • Session pool sharing a través de múltiples aplicaciones es un desastre a punto de ocurrir en silencio

  • Mover aplicaciones en torno en máquinas con diferentes ambientes es una migraña que supone 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 lío, también:

    • Existen 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).Se puede arreglar llamando if(! Page.IsValid) { return ; }
    • ASP botones, por lo general no funciona correctamente dentro de UpdatePanels
    • Cuanto más contenido en su UpdatePanel, más datos se transmiten de forma asíncrona, por lo que el tiempo que tarda en cargar
    • Si su Panel AJAX tiene un problema o un error de algún tipo, que se "bloquea" y no responde a los eventos dentro de él más
0
no

una cosa ASP.NET pura, pero ...

Estaba tratando de utilizar 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 EXTIENDE ...

No se pudo usar ninguno de los que tienen OLEDB.

OLEDB query to SQL Server fails

(También, que era poco por el response.redirect() en el try ... catch 'característica' mencionado en el PO! Gran hilo!)

0

de Databound controla dentro de un INamingContainer el control no debe colocarse dentro de controles con plantillas, como FormView. Ver this bug report 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 por lo que demuestra bien el asunto: AJAX Tabcontainer inside formview not inserting values