Archivo de la etiqueta: asp.net

Error: The message received from the server could not be parsed

Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed

Si te encuentras con este error seguramente estés utilizando UpdatePanel… ¿no es así?

Incluso es posible que te pase inadvertido si no tienes activado el depurador de javascript.

E hilando más fino… ¿este error solamente te aparece en Internet Explorer?

Si todas tus respuestas han sido «sí» entonces es posible que te estés encontrando con el mismo problema con el que me encontré yo.

Te comento la manera en que yo solucioné este error:

Borrar cualquier código javascript que tengas dentro del updatepanel y sitúalo fuera.

Espero que te haya servido.

Problemas con OWIN en un hosting compartido

Si vas a desarrollar una aplicación asp.net con OWIN y piensas alojarla en un servidor compartido debes tener esto en cuenta.

En muchos proveedores de hosting compartido tienen configurado en IIS el nivel de confianza high, medium, low… pero no está «Full».

Esto es importante porque los ensamblados OWIN necesitan para su perfecta ejecución el nivel de confianza Full. (trust level=»Full»). Este parámetro se puede configurar en el web.config pero será inútil ponerlo si a nivel de máquina el machine.config no permita sobrescribirlo.

trust_level

Los problemas con OWIN en un hosting compartido parten de que OWIN utiliza reflection para instanciar algunos objetos y la seguridad del servidor no lo permite.

Existen varias soluciones, pero todas pasan por contratar otro tipo de hosting:

  • Servidor Virtual, quizá la más económica priori.
  • Azure, se paga por recursos utilizados y es altamente escalable.
  • Servidor dedicado, seguro la menos económica.

ValidationSummary salta al inicio de la página

Este problema surge cuando en una página ASP con scroll se tiene un control Validation Summary. Al pulsar el botón que desencadena la validación en cliente la página «sube» hasta arriba cuando en muchos casos lo deseable es que no se mueva.

Si se quita el Validation Summary el salto no lo hace.

Para solucionar este problema existen dos soluciones:

  • Trabajar la validación únicamente en servidor, esto significa desactivar validaciones de cliente para todos los controles de validación (EnableClientScript=»false»)
  • Deshabilitar la función ScrollTo de javascript. Esto sería con este código:

<script type="text/javascript">
window.scrollTo = function() { }
</script>

jQuery $(document).ready no siempre funciona con updatepanel

Si estás trabajando con UpdatePanel y jQuery puede ser que acabes teniendo un problema cuando cargues la página parcialmente.

Partimos de lo siguiente:

En la carga inicial de la página realizamos con jQuery algunas acciones mediante el $(document).ready().

Comprobamos que cuando ejecutamos la página esto funciona correctamente.

Cuando hacemos una carga parcial de la página dentro de un UpdatePanel entonces no se ejecutará la función ready() de jQuery ya que el DOM se ha creado en la carga inicial.

Si queremos que se produzcan las mismas acciones en la carga parcial usaremos el siguiente código:


$(document).ready(function() {
 // Nuestro código al incializar la página (DOM cargado)
});

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_endRequest(function() {
 //Volver a escribir nuestro código al realizar una carga parcial de la página con UpdatePanel
});

Programar una API con ASP.NET

Como sabemos el protocolo HTTP no sirve únicamente para servir páginas Web sino que también puede actuar como APIs que exponen servicios y datos. Estos servicios pueden ser consumidos por una gran cantidad de clientes como pueden ser navegadores, aplicaciones de escritorio, etc.

Crear un proyecto ASP.NET Web API

Centrándonos un poco más en ASP.NET, con Visual Studio 2013 existe la posibilidad de crear de una manera extremadamente fácil un proyecto API. Se hará a través de una plantilla.

Web API
Nuevo proyecto Web
Web API 2
Asignar plantilla Web API a la creación del proyecto

Gracias a esta plantilla Visual Studio nos creará automáticamente un esqueleto que nos permitirá poder añadir elementos de servicio que darán funcionalidad a nuestra API. En la anterior imagen creamos un proyecto vacío pero si nos fijamos también hemos marcado más abajo que queremos que nos añada los directorios y las referencias necesarias en el proyecto.

Como siempre las cosas se pueden hacer de distintas maneras… en este caso también se puede afrontar la creación de la API con MVC. En nuestro caso continuaremos sin utilizar MVC.

Añadir  un modelo

A continuación añadiremos un modelo. El modelo es un objeto que representa los datos de tu aplicación. ASP.NET Web API puede serializar automáticamente tu modelo a JSON, XML o cualquier otro formato y entonces escribir los datos serializados dentro del cuerpo de la respuesta HTTP. Además el cliente siempre puede indicar que formato quiere fijando la cabecera en la petición del servicio.

En este ejemplo añadiremos un modelo que represente un producto. Para ello haremos click derecho encima de la carpeta Models y añadiremos una clase.

Web API Modelo

Nombraremos la clase como «Product» y escribiremos el siguiente código:

namespace ProductsApp.Models
{
 public class Product
 {
 public int Id { get; set; }
 public string Name { get; set; }
 public string Category { get; set; }
 public decimal Price { get; set; }
 }
}

Añadir un controlador

En Web API, un controlador es un objeto que maneja peticiones HTTP. Añadiremos un controlador que devuelva una lista de productos o un único producto especificado por un Identificador.

Para añadir un controlador haremos click derecho sobre el directorio «Controllers» dentro de la solución y seleccionaremos «Controller».

Web API Controlador

En la nueva ventana elegiremos Web API Controller – Empty. Pulsaremos añadir.

Web API Controlador 2

Le podremos llamar «ProductsController» por ejemplo. Insertaremos el siguiente código dentro de este fichero:


using ProductsApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;

namespace ProductsApp.Controllers
{
 public class ProductsController : ApiController
 {
 Product[] products = new Product[]
 {
 new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
 new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
 new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
 };

public IEnumerable<Product> GetAllProducts()
 {
 return products;
 }

public IHttpActionResult GetProduct(int id)
 {
 var product = products.FirstOrDefault((p) => p.Id == id);
 if (product == null)
 {
 return NotFound();
 }
 return Ok(product);
 }
 }
}

Si nos fijamos existen 2 métodos: GetAllProducts y GetProduct. Gracias a ASP.NET Web API podremos acceder a cada uno de estos métodos a través de las siguientes URIs: /api/products y /api/products/id.

Como vemos es muy sencillo programar una API con ASP.NET. En otro post hablaremos de cómo se puede consumir un servicio de este tipo con AJAX y jQuery.

Error en owin al renombrar proyectos

Si renombramos un proyecto o varios de ellos en una aplicación web y estamos utilizando Owin es posible que aparezca el siguiente error:

The following errors occurred while attempting to load the app.
– The OwinStartup attribute discovered in assembly ‘x’ referencing startup type ‘x.Startup’ conflicts with the attribute in assembly ‘y’ referencing startup type ‘y.Startup’ because they have the same FriendlyName ». Remove or rename one of the attributes, or reference the desired type directly.
To disable OWIN startup discovery, add the appSetting owin:AutomaticAppStartup with a value of «false» in your web.config.
To specify the OWIN startup Assembly, Class, or Method, add the appSetting owin:AppStartup with the fully qualified startup class or configuration method name in your web.config.

Este error se suele producir porque existen dos ensamblados cargados en nuestra carpeta bin de la solución que contiene una clase startup. En la ejecución de la aplicación asp.net no sabe resolver cual de las dos clases debe ejecutar y de ahí el error.

La solución es ir a la carpeta bin y borrar la dll antigua que ya no es necesaria.

Como crear un Theme en ASP NET

Para crear un Tema o Theme en Visual Studio debemos hacer click derecho sobre el proyecto web y añadir la carpeta de ASP.NET App_Themes . Nos pedirá un nombre, le daremos el nombre MainTheme por ejemplo.

Una vez creado este directorio especial podemos añadirle dentro de sí un nuevo item de extensión .Skin.

Lo último que nos queda es especificar en el web.config la theme que usará el sitio por defecto.


<configuration>
 <system.web>
<pages theme="MainTheme">

</pages>

</system.web>

</configuration>

Ya estará funcionando nuestro tema, solo quedaría definir en nuestro skin las propiedades de cada control.

Crear un botón de ASP NET con Glyphicon

Si con Bootstrap queremos utilizar un botón que tenga un icono de Glyphicon tenemos que olvidarnos del clásico asp:button y utilizar asp:linkbutton de la siguiente manera:


<asp:LinkButton runat="server" Text="<span class='glyphicon glyphicon-remove'></span>" CssClass="btn btn-default btn-xs" />

Lo que hacemos es darle una clase al linkbutton de Boostrap y dentro del text (innerhtml) la etiqueta span y su contenido.

No olvides que debes de tener los ficheros de css necesarios para que esto funcione, o sea bootstrap.css o bootstrap.min.css.