JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

No me aparece el DataContext en un LinqDataSource

Linq to SQL es una tecnología precursora del actual Entity Framework que fue pionera en sacar partido a Linq para crear un ORM fácil de utilizar con esta tecnología. Su principal limitación es que solo funciona con SQL Server y que los "mapeos" deben ser 1 a 1 con las tablas (una tabla = 1 clase). Sin embargo es tremendamente fácil de usar y tiene un diseñador visual muy efectivo, por lo que a mucha gente (incluyéndome yo mismo) nos gusta mucho y es válido para la mayor parte de las situaciones si trabajas con el gestor de datos de Microsoft.En ASP.NET Web Forms (otra tecnología ahora en retroceso pero tremendamente efectiva para ciertos tipos de aplicaciones Web, como por ejemplo las orientadas a gestión) se incluye un control para acceso visual a datos llamado LinqDataSource que está especialmente diseñado para trabajar con esta tecnología. Este control combinado con los diferentes controles enlazados a datos (y especialmente los ListView y DataPager) permite crear interfaces web ori... [Más]

La propiedad EnableViewStateMac ya no funciona en ASP.NET Web Forms 4.5.2

Hace unas semanas Microsoft anunció la revisión 4.5.2 de .NET, que actualiza un poco la última versión de la plataforma .NET (la 4.5) con algunos ajustes y correcciones. Si nos atenemos a lo que anunciaron en el blog oficial, e incluso en la lista de cambios del lanzamiento, no hay nada que llame la atención sobre un pequeño detalle que sin embargo es muy importante: han deshabilitado la posibilidad de desactivar el MAC del ViewState en ASP.NET Web Forms. Y esto ¿qué significa? Para verlo, primero demos un repaso rápido a qué es el MAC y para qué sirve. Luego veremos qué implicaciones tiene el hecho de no poder desactivarlo. Funcionamiento del ViewState y autenticación El ViewState, como todos deberíamos saber, es una parte fundamental del funcionamiento de Web Forms. Almacena el estado de los diferentes controles de una página entre postbacks. En Web Forms cada evento que se produce que se gestiona en el servidor implica un envío de la página de nuevo al servidor. A estos reenv... [Más]

Acceder a la herramienta de configuración de ASP.NET en Visual Studio 2013

Hasta la versión 2012 de Visual Studio disponíamos de un acceso directo muy cómodo desde el propio entorno que nos permitía lanzar la herramienta de configuración de ASP.NET: De esta manera abríamos la utilidad que nos permitía configurar la seguridad de la aplicación: usuarios, roles, proveedores para éstos, etc... En Visual Studio 2013 y .NET 4.5 se ha dado preferencia a las bibliotecas de ASP.NET Identityen detrimento del clásico sistema de Membership. Por ello, aparte de basar las nuevas plantillas de proyecto en estas nuevas bibliotecas de autenticación y autorización, se ha retirado el acceso directo a la herramienta anterior (y no se proporciona tampoco una herramienta análoga para lo nuevo, debiendo recurrir a la implementación por defecto incluida en las plantillas). Sin embargo, si necesitas (o prefieres) utilizar el antiguo sistema de autenticación y te interesa acceder a la herramienta, todavía puedes hacerlo, aunque no te resultará tan cómodo. El acceso se basa en el... [Más]

Nuevos proyectos unificados de aplicaciones ASP.NET en Visual Studio 2013

Un poco de historia para comenzar y ayudarnos a entender el porqué de lo que voy a explicar. Cuando nació ASP.NET hace ya casi 15 años lo único que existía era ASP.NET Web Forms. Este novedoso paradigma de desarrollo trataba de acercar el desarrollo web a los programadores de escritorio, y permitía arrastrar y soltar controles, controlar eventos en el servidor como si fueran eventos de cliente, etc… Algo muy innovador y que todavía sigue siendo muy útil (y muy utilizado), pero que cada vez se usa más para ciertos ámbitos concretos, como las aplicaciones empresariales. Una década más tarde Microsoft decidió que aunque esto estaba muy bien para crear rápidamente aplicaciones de tipo empresarial no daba la flexibilidad apropiada para crear aplicaciones web generales, donde se necesitaba un control absoluto sobre el HTML generado, y se necesita poder sacar partido con total libertad a... [Más]

Validación no-intrusiva en ASP.NET 4.5 y errores de validadores

Por defecto, ASP.NET 4.5 (con Visual Studio 2012) cambió la manera en la que funciona la validación de controles. Desde fuera parece que nada ha cambiado, pero por debajo ahora se utiliza por omisión un nuevo tipo de validación no intrusiva basada en jQuery, en lugar de los scripts anteriores. Ahora, la validación de lado cliente se consigue de una manera más sencilla usando el plugin jQuery validation, y decorando los diferentes controles de validación usando atributos "data-val", en lugar de llenar tu página de scripts de validación. Por ejemplo, este es el HTML resultante de un control RequiredValidator cuando se está usando el modo de validación no-intrusiva: 1: <span 2: id="RequiredFieldValidator1" 3: data-val-controltovalidate="TextBox1" 4: data-val-focusOnError="t" 5: data-val-errormessage="Required!" 6: data-val-display="Dynamic" 7: data-val="t... [Más]

Cómo depurar el evento Application_End en ASP.NET

El evento Application_End se desata en una aplicación Web cuando ésta termina por cualquier motivo, aunque sea para reiniciarse. Escribimos un gestor de este evento dentro de Global.asax en el que incluimos cualquier tipo de código que se encargará de dejar en el estado correcto cualquier recurso global que hayamos inicializado en el evento complementario que se lanza cuando arranca la aplicación: Application_Start. Esto es válido tanto para aplicaciones Web Forms como MVC. El código que pongamos en estos eventos se lanzará únicamente cuando se arranque y se detenga la aplicación. Si queremos depurarlo desde Visual Studio, usando el servidor de desarrollo (que es lo habitual), la cosa tiene algo de truco. El problema es que no es tan fácil conseguir que se cierre la aplicación y que puedas depurarlo al mismo tiempo. Al contrario de lo que muchos programadores se piensan, cerrar el navegador no detiene la aplicación, que sigue activa por detrás, sólo cierras la sesión actual del u... [Más]

Solucionar el error: “BC30456: 'InitializeCulture' is not a member of” en ASP.NET

Este es un error muy típico en algunas aplicaciones y me he acordado de él a raíz de la pregunta de un alumno de mi curso de preparación del examen 70-515 en campusMVP. La situación es la siguiente: tenemos un desarrollo ASP.NET hecho y todo funciona en Visual Studio a las mil maravillas. Lo publicamos al servidor Web y de repente, al intentar acceder al sitio Web, nos encontramos un error como este: “¿Cómo?¿Inicializar cultura? Pero si yo no tengo nada de esto en mi aplicación. ¿Qué demonios pasa aquí?“ Por más que buscas en tu código no eres capaz de encontrar nada mal, y es que además “¡en mi máquina funciona!” (que es lo que decimos todos cuando algo falla en producción). El problema viene de un hábito muy común y que, realmente, Visual Studio debería gestionar mejor: renombrar páginas ASPX en Sitios W... [Más]

Cómo gestionar variables de sesión como un PRO

A la hora de trabajar con sesiones en C#, el mayor problema es que, al contrario que en VB, no se facilita el manejo directo de los valores como si fueran propiedades del objeto Session ni se transforman al tipo correcto para hacer operaciones como Session("Contador")++ y similares. Además, adicionalmente, hay que comprobar que las variables existan antes de poder hacer todas estas operaciones. Por ejemplo, si queremos trabajar con una cadena de texto en sesión y poder asignarle un valor, se trata de algo tan sencillo como lo es en VB ya que sólo debes asignarla directamente, así: 1: Session["TextoAGuardar"] = "Este es el texto que quiero almacenar"; Sin embargo si lo necesitamos es realizar una operación matemática es un poco más lioso ya que deberemos comprobar primero que la variable existe y contiene un valor, y ademas convertirla desde "object" que es lo que devuelve por defecto una variable de sesión, al tipo correc... [Más]

Pedir una cosa y recibir otra - Parte IV: Llamadas de servidor que recrean la petición completa

Hasta ahora con Transfer y Execute hemos visto que podemos ejecutar otras páginas del mismo tipo sin necesidad de redirección desde el lado cliente. Sin embargo un efecto secundario que tiene su uso es que, como no se regenera la petición sino que se ejecutan dentro del contexto de la petición actual, no entran en juego los controles de seguridad y otros eventos del pipeline HTTP para la segunda página. Es por ello por lo que en nuestro ejemplo se ha podido mostrar el contenido de la página "P2.aspx" a pesar de que estaba protegida. Existe una variante de estos métodos llamada TransferRequest que permite conseguir una petición completa desde el propio servidor, sin pasar por el cliente como ocurría con Redirect. Este método se utiliza del mismo modo que Transfer pero en este caso la segunda página pasa por todo los estadios de una petición HTTP normal, como si hubiera sido hecha desde el cliente desde... [Más]

Pedir una cosa y recibir otra - Parte III: Ejecutar otras páginas

En la entrega anterior de esta serie vimos a fondo cómo funcionaba el método Transfer. Seguimos ahora profundizando en otros métodos relacionados. El método Transfer por debajo lo único que hace es llamar al método Execute de la misma clase HttpUtility: Este método es prácticamente idéntico a Transfer, como vemos en este código, por lo que a todos los efectos podemos sustituir las llamadas a Transfer por llamadas a Execute y no perder funcionalidad. Además, si nos fijamos en el código de Transfer de una figura anterior, llama continuación a Response.End. Esto como ya vimos en la primera parte con Redirect, tiene algunas implicaciones respecto al rendimiento debido a la generación de excepciones ThreadAbortException, por lo que en sitios muy grandes donde cada milésima cuenta puede ser interesante sustituir las llamadas a Transfer por llamadas a Execute con una posterior a CompleteRequest (repasa el primer post para verlo). Si hacemos lo mismo que antes pero llamando a Execute en ... [Más]