Todo en ASP.NET

Blog dedicado a la programación con Visual Studio .NET….. especialmente desarrollo Web

[ASP.NET MVC] Utilizando el Grid.MVC paso a paso

Publicado por Julio Avellaneda en 05/14/2013

Hola a todos, una de las funcionalidades más comunes a la hora de mostrar datos es que dichos datos se puedan mostrar de una forma ordenada, se pueda filtrar, ordenar, paginar, etc… y cuando trabajamos con ASP.NET Web Forms es casi tan simple como el arrastrar un control GridView, enlazarlo a datos y setearle algunas propiedades.

Pero como ya sabemos en ASP.NET MVC no tenemos esos controles disponibles, así que para solucionar el problema vamos a utilizar el Grid.MVC, este grid me gusta bastante y entre sus principales características tiene:

  • Paginación
  • Ordenamiento
  • Filtros
  • Localización

Pero bueno, ahora si a ver la implementación, lo primero que vamos a tener es un clase Client que será nuestro modelo:

public class Client
{
	public int Id { get; set; }
	public string Name { get; set; }
	public string Email { get; set; }
}

Luego agregamos por medio de Nuget el paquete Grid.MVC:

image

Así como Bootstrap (sí el de Twitter):

image

Una vez que añadimos el Grid.MVC se han creado varios archivos nuevos en el proyecto, un par de vistas para manejar el grid, el archivo Gridmvc.css para los estilos y tres archivos JavaScript:

image

image

image|

Luego necesitamos un controlador, en este caso solo vamos a tener una acción y los datos los vamos a definir de manera local (acá podrías obtener los datos de una fuente externa como una base de datos):

public class ClientController : Controller
{
	private readonly List clients = new List()
	{
		new Client { Id = 1, Name = "Julio Avellaneda", Email = "julito_gtu@hotmail.com" },
		new Client { Id = 2, Name = "Juan Torres", Email = "jtorres@hotmail.com" },
		new Client { Id = 3, Name = "Oscar Camacho", Email = "oscar@hotmail.com" },
		new Client { Id = 4, Name = "Gina Urrego", Email = "ginna@hotmail.com" },
		new Client { Id = 5, Name = "Nathalia Ramirez", Email = "natha@hotmail.com" },
		new Client { Id = 6, Name = "Raul Rodriguez", Email = "rodriguez.raul@hotmail.com" },
		new Client { Id = 7, Name = "Johana Espitia", Email = "johana_espitia@hotmail.com" }
	};

	public ActionResult Index()
	{
		return View(clients);
	}
}

Ahora viene la vista, lo importante en la vista es que será fuertemente tipada a una colección de nuestra clase cliente, es decir: @model IEnumerable<Grid.Models.Client> (si quieres dale una mirada a Una referencia sobre las vistas), luego se debe hacer un using GridMvc.Html: @using GridMvc.Html

@model IEnumerable
@using GridMvc.Html

Luego las referencias a los estilos y a los js:

	<link href="@Url.Content(" rel="stylesheet" />
	<link href="@Url.Content(" rel="stylesheet" /><script type="text/javascript" src="@Url.Content("></script><script type="text/javascript" src="@Url.Content("></script>

y finalmente la implementación del helper:

@Html.Grid(Model).Columns(columns =>
	{
		columns.Add(c => c.Id).Titled("Client ID");
		columns.Add(c => c.Name).Titled("Name").Filterable(true);
		columns.Add(c => c.Email).Titled("Email");
	}).WithPaging(3).Sortable(true)

Observando el código anterior, vemos que para aplicar paginación se utiliza el método WithPaging(#registrosxpágina), para el ordenamiento Sortable el cual puede ser aplicado a todas las columnas como en el ejemplo o a una columna determinada utilizando en la definición de la columna, y Filterable para especificar que la columna permite aplicarle filtros, Filterable al igual que Sortable se pueden aplicar de manera global a todas las columnas o de forma individual.

Y el resultado:

imageimage
Espero les haya gustado el post y les sea de utilidad, luego veremos más características de este helper.

Descarga el código!

Publicado en ASP.NET MVC | Etiquetado: | 3 Comentarios »

[ASP.NET MVC] Usando el @section

Publicado por Julio Avellaneda en 05/10/2013

Hola a todos, bueno y de que va el post? pues simplemente para mostrar la funcionalidad de la etiqueta @section, así que al código… si tenemos definido el siguiente layout:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    @RenderBody()
    <div id="header">
        @RenderSection("Header", false)
    </div>

    <div id="footer">
        @RenderSection("Footer", false)
    </div>
    @Scripts.Render("~/bundles/jquery")
    @RenderSection("scripts", required: false)
</body>
</html>

Si nos fijamos bien en el html anterior, podemos ver dos líneas interesantes:

@RenderSection("Header", false)
@RenderSection("Footer", false)

Allí simplemente estamos definiendo dos secciones, y como segundo parámetro se define si la sección es requerida o no. Y ahora vamos a crear una vista y le asociamos el layout creado:

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
@section Footer
{
	<p>Section Footer</p>
}
@section Header
{
	<p>Section Header</p>
}

Ahora en la vista para referenciar el contenido de cada sección usamos el @section <Nombre de la sección>, he puesto en orden diferente el contenido de cada sección para mostrar que cuando se renderiza la página el orden lo establece es el layout.

Espero les sea de utilidad, saludos!

Descarga el código!

Publicado en ASP.NET MVC | Etiquetado: | 1 comentario

[ASP.NET MVC] Trabajando con el sistema de routing

Publicado por Julio Avellaneda en 05/06/2013

El sistema de routing en ASP.NET MVC es un componente clave de este sistema, básicamente nos permite crear un sistema de mapeo para poder encontrar/llamar a los controladores y acciones de ellos, y aunque con algunas plantillas ya viene un sistema de routing como el siguiente en algunos casos no es suficiente:

routes.MapRoute(
	name: "Default",
	url: "{controller}/{action}/{id}",
	defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Ahora, vamos a crear un nuevo controller con una par de acciones (sin una funcionalidad real):

public class AdminController : Controller
{
	public ActionResult Login(int id, string role)
	{
		ViewBag.Id = id;
		ViewBag.Role = role;
		return View();
	}

	public ActionResult SearchByName(string name)
	{
		ViewBag.Name = string.Format("Searching... {0}", name);
		return View();
	}
}

Y luego las view para cada acción:

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Search By Name</title>
</head>
<body>
    <div>
        <h1>Search Admin by Name</h1>
        <p>@ViewBag.Name</p>
    </div>
</body>
</html>

y

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Login</title>
</head>
<body>
    <div>
        <h1>Admin Login</h1>
        <p>@ViewBag.Id</p>
        <p>@ViewBag.Role</p>
    </div>
</body>
</html>

Ahora si para la acción SearchByName se quiere que responda a una URL semejante a: http://<dominio>/Admin/<nombre a buscar> obtenemos el siguiente error:

image

Y básicamente el error se da porque no se tiene un mapeo similar al que se requiere, así que ya tenemos un caso en el cual el routing por defecto no va bien, entonces vamos a añadir uno nuevo:

routes.MapRoute(
	name: "AdminSearch",
	url: "admin/{name}",
	defaults: new { controller = "Admin", action = "SearchByName" }
);

Bien, y ahora la pregunta es, dicho routing debe ir antes o después del routing por defecto? La respuesta es antes, ya que esas rutas siempre se leen en el orden en que son definidas, el mismo caso se repite cuando se quiere acceder a la acción Login del AdminController, pero en este caso se añade la siguiente ruta:

routes.MapRoute(
	name: "Admin",
	url: "admin/login/{id}/{role}",
	defaults: new { controller = "Admin", action = "Login" }
);

Espero les sirva el post, saludos!

Descarga el ejemplo!

Publicado en ASP.NET MVC | Etiquetado: | 1 comentario

[ASP.NET MVC] Introducción a Single Page Applications

Publicado por Julio Avellaneda en 03/26/2013

Hola amigos, hace poco tuce la dicha de dar una pequeña charla sobre Single Page Applications, así que ahora les comparto el material, espero les sirva y como comente en el video, 1 hora es muy poco tiempo, así que escribiré al respecto.

Descargar el webcast!

Saludos!

Publicado en ASP.net, ASP.NET MVC, Javascript | Etiquetado: , , | 2 Comentarios »

[ASP.NET MVC] Organizando el proyecto por áreas

Publicado por Julio Avellaneda en 03/13/2013

Hola a todos, cuando trabajamos con ASP.NET Web Forms, una característica muy utilizada es crear carpetas para trabajar diferentes temas y lograr una mejor organización del proyecto, en tal caso podemos ver carpetas como Administrador, Rh, Reportes, etc, según las necesidades del proyecto, pero cuando estamos en ASP.NET MVC, dicha organización no es tan simple (claro que difícil no es), ya que debemos tener en cuenta el sistema de routing que maneja MVC.

Para solucionar lo anterior, desde la versión 2 de MVC contamos con algo conocido como Areas, que sencillamente permiten realizar la organización por carpetas de nuestra aplicación, lo interesante es que podemos decir que cada área viene a ser un pequeño proyecto de MVC ya que disponemos de la misma organización altamente conocida (controladores, vistas, modelos, config).

Para crear una nueva área simplemente click derecho sobre el proyecto –> add –> Area… y le damos un nombre, para el ejemplo que voy a mostrar la he llamado Reportes, una vez termina la creación, tenemos en la raíz una carpeta Areas y allí dentro otra carpeta Reportes que tiene el mini proyecto de MVC para el área Reportes:

image

Si nos fijamos bien, también se ha creado un archivo ReportesAreaRegistration.cs, allí es donde se define el ruteo para el área reportes:

public override void RegisterArea(AreaRegistrationContext context)
{
	context.MapRoute(
		"Reportes_default",
		"Reportes/{controller}/{action}/{id}",
		new { action = "Index", id = UrlParameter.Optional }
	);
}

Y lo mejor de todo, si vamos al Global.asax al evento Application_Start vemos que ya se está cargando dicha configuración:

AreaRegistration.RegisterAllAreas();

Hasta el momento sencillo no? luego, en Controllers (principal) añadimos un nuevo controlador Home, con la acción Index, y le creamos su vista:

El controlador:

public class HomeController : Controller
{
	public ActionResult Index()
	{
		return View();
	}
}

La vista:

@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
<h2>Vista del controlador Home Principal</h2>
@Html.ActionLink("Ir a reportes", "Index", new { area = "Reportes"})

Es importante notar, que en el helper ActionLink en el tercer parámetro le estamos diciendo que vaya al área Reportes.

Igualmente, en el área Reportes añadimos un nuevo controlador con su correspondiente acción y vista:

El controlador:

public class HomeController : Controller
{
	public ActionResult Index()
	{
		return View();
	}
}

La vista:

@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
<h2>Vista del controlador Home del Area Reportes</h2>
@Html.ActionLink("Ir al home", "Index", new { area = ""})

En este último caso, como deseamos ir al controlador principal, al area no le asignamos un valor en especial.

Ahora, si probamos, comienzan los problemas Confundido, y el primer error que sale es:

image

En ese error la parte más importante es:

The request for ‘Home’ has found the following matching controllers:
Areas.Areas.Reportes.Controllers.HomeController
Areas.Controllers.HomeController

Del cual es posible deducir que el problema se da porque tenemos dos controladores con el mismo nombre, así que vamos al método RegisterRoutes de la clase RouteConfig y en la definición del ruteo añadimos el namespace, quedando:

routes.MapRoute(
	name: "Default",
	url: "{controller}/{action}/{id}",
	defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
	namespaces: new[] { "Areas.Controllers" }
);

Listos, y va de nuevo, ejecutamos de nuevo y funciona, pero cuando clickeamos en el link para ir al área de nuevo error:

image

En este caso, tenemos que ir al archivo Web.config del área y si observamos esa línea encontramos algo medio raro en la versión: Version=__WebPagesVersion__.0.0 umm que raro, simplemente lo que debemos hacer es cambiarla por: Version=2.0.0.0, este proceso debe realizarse en las líneas <section name=”host” …/> y en <section name=”pages” …/>, y tenemos una línea más cambiar, que es <host factoryType…/> dentro de <system.web.webPages.razor>, pero en ese caso la versión debe ser la 4.0.0.0.

Si ejecutamos de nuevo, ahora el error será en la línea <add namespace=”System.Web.Optimization”/> del config del área, para lo cual podemos eliminarla o instalar el paquete Microsoft ASP.NET Web Optimization Framework (el ejemplo lo he realizo usando la plantilla en blanco, así que viene peluquiadito)

Y ahora sí, todo nos funciona de maravilla!

La verdad que el uso de áreas permite organizar mucho mejor el proyecto, y más cuando el proyecto es bastante grande.

Espero les sea de utilidad el post, como siempre les dejo el código del ejemplo, saludos!

Descargar el ejemplo!

Publicado en ASP.NET MVC | Etiquetado: | 5 Comentarios »

[ASP.NET] Hands On Labs Web Forms Y MVC

Publicado por Julio Avellaneda en 02/27/2013

Hola a todos, hoy simplemente les quiero compartir unos hands on labs tanto para ASP.NET Web Forms como para ASP.NET MVC los cuales tenemos disponibles ahora en el sitio oficial de ASP.NET, se que como a mi les serán de gran ayuda, los links son:

Hands On Labs Web Forms

Hands On Labs MVC

Saludos.

Publicado en ASP.net, ASP.NET MVC | Etiquetado: , | 1 comentario

[ASP.NET MVC] Manejando errores con HandleError

Publicado por Julio Avellaneda en 02/25/2013

Hola a todos, existe varias formas de maneras para manejar errores en aplicaciones Web, así como herramientas que permiten realizar log de los mismos como Log4Net, Enterprise Library o el escribir código y crear un pequeño manejador; sin embargo hoy quiero mostrarles otra forma de manejar errores, el cual es bastante sencillo.

Cuando se quiere manejar algún error, generalmente se utiliza un bloque try-catch, así por ejemplo para controlar el caso de una división por cero una aproximación podría ser:

try
{
//código
}
catch (DivideByZeroException ex)
{
//manejo del error
}

Ahora, ASP.NET MVC ofrece una forma de realizar un manejo parecido a estos errores y es usando el atributo HandleError, siguiendo con el mismo ejemplo de la división por cero, la implementación de HandleError en una acción sería algo así:

[HandleError(ExceptionType = typeof(DivideByZeroException), View = "OperationError")]
public ActionResult Index()
{
    var num2 = 0;
    var result = 5 / num2;
    return View(result);
}

Allí se usan dos parámetros, ExceptionType para especificar el tipo de la excepción y View par definir la vista a la cual se debe re direccionar cuando ocurra el error, un punto bastante interesante es que el atributo HandleError se puede aplicar a nivel de acción y de controlador.

Espero les sea interesante el post, les dejo el código para que lo descargue, saludos!

Descarga el ejemplo!

Publicado en Sin categoría | 1 comentario

[ASP.NET Web API] Filtros de validación

Publicado por Julio Avellaneda en 02/19/2013

Realmente ando muy contento trabajando con Web API, sobretodo por su facilidad de uso, sin embargo, unos de los puntos que debemos tener presente cuando creando servicios REST con Web API es la seguridad y la creación de filtros para no exponer sin consideración las acciones de nuestros servicios, para solucionar dicho problema es posible crear filtros y realizar todas esas validaciones necesarias.

Los filtros pueden ser aplicados en diferentes niveles:

  • A nivel de clase
  • A nivel de acción
  • A nivel global

Para crear un filtro, se debe crear una clase que herede de ActionFilterAttribute y luego sobrescribir el método OnActionExecuting, para ver el tema en acción crearemos un filtro para validar que el dominio del cual están realizando la petición sea conocido, por lo tanto creamos la clase FilterDomainAttribute:

public class FilterDomainAttribute : ActionFilterAttribute
{
	public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
	{
		var domain = "dominio";
		if (!string.Equals(actionContext.Request.RequestUri.Host, domain, StringComparison.OrdinalIgnoreCase))
		{
			actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
				{
					Content = new StringContent("Petición no autorizada")
				};
		}
	}
}

Entonces, creamos la clase FilterDomainAttribute la cual hereda de ActionFilterAttribute, luego hacemos un override al método OnActionExecuting y allí lo que hacemos es obtener el dominio con actionContext.Request.RequestUri.Host y se compara en este caso con el valor de la variable domain, en caso de no ser un dominio válido retornamos el mensaje “Petición no autorizada” con el estado de no autorizado HttpStatusCode.Unauthorized.

Ahora, creamos un controller (muy sencillo) para el manejo de clientes, entonces la clase Client:

public class Client
{
	public int ClientId { get; set; }
	public string Name { get; set; }
	public string Twitter { get; set; }
}

Y el controlador:

public class ClientController : ApiController
{
	private readonly IEnumerable<Client> clients = new List<Client>() {
		new Client (){ ClientId = 1, Name = "Julio", Twitter = "@julitogtu"},
		new Client (){ ClientId = 2, Name = "Juan", Twitter = "@JuanKRuiz"},
		new Client (){ ClientId = 3, Name = "Nicolas", Twitter = "@nicolocodev"},

	};

	public IEnumerable<Client> GetAll()
	{
		return clients;
	}

	public Client GetById(int id)
	{
		return new Client() { ClientId = 1, Name = "Julio", Twitter = "@julitogtu" };
	}
}

Para utilizar el filtro a nivel de clase o a nivel de acción lo único que se debe utilizar es decorar bien sea la clase o la acción con el atributo creado (no olvidar referenciar el namespace ActionFilter.Filter):

[FilterDomain]
public class ClientController : ApiController

[FilterDomain]
public IEnumerable GetAll()

Algo interesante es que es posible escribir solo FilterDomain, y recuerden que el nombre de la clase es FilterDomainAttribute.

Y ahora, si se quiere aplicar el filtro a nivel global se debe ir al global.asax y definirlo en el Application_Start:

GlobalConfiguration.Configuration.Filters.Add(new FilterDomainAttribute());

Si quieren ver otros ejemplos relacionados les recomiendo dos post del master Gonzalo:

Les dejo el código del ejemplo: Descarga el ejemplo!

Saludos!

Publicado en ASP.net, ASP.NET MVC, ASP.NET Web API, Rest | Etiquetado: , , , | 1 comentario

[ASP.NET MVC] Cargar una vista parcial con AJAX

Publicado por Julio Avellaneda en 02/07/2013

Hola, una característica de ASP.NET MVC que me gusta bastante son las vistas parciales, y lo mejor de todo es que podemos usarlas en conjunto con AJAX de una manera realmente sencilla, ya que el mismo framework ofrece helpers que permiten realizar tareas comunes como la que vamos a ver en este post: cargar una vista parcial.

Vamos a realizar un pequeño formulario del tipo maestro – detalle, la idea es simular las ventas por mes, y en el detalle visualizar que producto se vendió por mes y su valor (tendremos datos estáticos, pero la idea es que se conectará con un repositorio de datos).

Primero vamos a definir dos clases como modelo (las clases son sencillas para realizar el ejemplo):

public class VentasMes
{
	public int Id { get; set; }
	public string Mes { get; set; }
	public int Valor { get; set; }
	public ICollection DetalleMes { get; set; }
}

public class DetalleMes
{
	public int Id { get; set; }
	public string Producto { get; set; }
	public int Valor { get; set; }
	public VentasMes VentasMes { get; set; }
}

Es necesario añadir una referencia al js jquery.unobtrusive-ajax, primero vamos a crear el bundle correspondiente (si usas la plantilla de Internet Application ya se tiene definida):

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
				"~/Scripts/jquery.unobtrusive*",
				"~/Scripts/jquery.validate*"));

y luego la añadimos en el _Layout.cshtml:

@Scripts.Render("~/bundles/jqueryval")

Ahora, creamos el controllador VentasController con la acción List y algunos datos iniciales:

public class VentasController : Controller
{
	private readonly List ventasMes = new List()
	{
		new VentasMes()
		{
			Id = 1,
			Mes = "Enero",
			Valor=200000,
			DetalleMes = new List(){
			   new DetalleMes(){ Id = 1, Producto = "Producto 1", Valor = 50000},
			   new DetalleMes(){ Id = 1, Producto = "Producto 2", Valor = 50000},
			   new DetalleMes(){ Id = 1, Producto = "Producto 3", Valor = 50000},
			   new DetalleMes(){ Id = 1, Producto = "Producto 4", Valor = 50000}
			}
		},
		new VentasMes()
		{
			Id = 2,
			Mes = "Febrero",
			Valor=200000,
			DetalleMes = new List(){
			   new DetalleMes(){ Id = 1, Producto = "Producto 1", Valor = 100000},
			   new DetalleMes(){ Id = 1, Producto = "Producto 2", Valor = 100000}
			}
		},
	};

	public ActionResult List()
	{
		return View(ventasMes);
	}
}

Y ahora creamos la vista correspondiente List.cshtml:

@model IEnumerable<PartialView_Ajax.Models.VentasMes>

@{
    ViewBag.Title = "Resumen";
}

<h2>Resumen Ventas</h2>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Mes)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Valor)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Mes)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Valor)
        </td>
        <td>
            @Ajax.ActionLink("Detalles", "ViewDetails", new { id = item.Id }, new AjaxOptions { UpdateTargetId="divDetails" })
        </td>
    </tr>
}

</table>
<div id="divDetails"></div>

Como se puede observar, se esta haciendo uso del helper de Ajax.ActionLink, este tiene varios constructores, sin embargo el que estamos utilizando requiere como primer parámetro el texto del link, el segundo es la acción del controlador que se ejecuta, el tercero los datos enviados a la acción y el cuarto permite definir varias opciones, en este caso solo utilizo UpdateTargetId el cual permite definir el id del control en donde mostrar el resultado de la acción, en este caso será la vista parcial, y entonces la acción:

public ActionResult ViewDetails(int id)
{
	var detalle = ventasMes
					.Where(c => c.Id == id)
					.Select(c => c.DetalleMes)
					.FirstOrDefault();
	return PartialView("_Details",detalle);
}

La diferencia a una acción normal es que se retorna PartialView en lugar de View, y allí estamos definiendo el nombre de la vista parcial (_Details) y como segundo parámetro el modelo, entonces la definición de la vista parcial:

@model IEnumerable<PartialView_Ajax.Models.DetalleMes>

<fieldset>
    <legend>Detalle x Mes</legend>
    <ul>
        @foreach (var item in @Model)
        {
            <li>
                <p>@item.Producto (@item.Valor.ToString("c"))</p>
            </li>
        }
    </ul>
</fieldset>

Y listo, finalmente lo que vamos a obtener es:

image

Espero les haya gustado el post, les dejo el código del ejemplo:

Descarga el ejemplo!

Saludos.

Publicado en ajax, ASP.NET MVC | Etiquetado: | 1 comentario

[ASP.NET Web API] Respondiendo en JSON

Publicado por Julio Avellaneda en 01/22/2013

Hola, pues este será un mini-post, donde simplemente voy a mostrar como podemos configurar el tipo de respuesta que deseamos den nuestros controladores, más en especifico los métodos que ellos tienen. Si por ejemplo tenemos el siguiente controlador:

public class ClientController : ApiController
{
	private readonly IEnumerable clients = new List() {
		new Client (){ ClientId = 1, Name = "Julio", Twitter = "@julitogtu"},
		new Client (){ ClientId = 2, Name = "Juan", Twitter = "@JuanKRuiz"},
		new Client (){ ClientId = 3, Name = "Nicolas", Twitter = "@nicolocodev"},

	};

	public IEnumerable GetAll()
	{
		return clients;
	}
}

Si por ejemplo, probamos en IE lo que obtenemos es un xml:

image

Y ahora, para trabajar en formato JSON lo que hacemos es eliminar la respuesta en tipo XML, así entonces en el Global.asax:

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

y si ahora lo probamos de nuevo en IE:

image

Saludos

Publicado en ASP.net, ASP.NET MVC, ASP.NET Web API, Rest | Etiquetado: , , , | 1 comentario

 
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 1.631 seguidores