<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Return(GiS); : ASP.NET MVC 3</title><link>http://geeks.ms/blogs/gtorres/archive/tags/ASP.NET+MVC+3/default.aspx</link><description>Etiquetas: ASP.NET MVC 3</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Refrescar un WebGrid cada X tiempo de forma asíncrona</title><link>http://geeks.ms/blogs/gtorres/archive/2011/04/03/refrescar-un-webgrid-cada-x-tiempo-de-forma-as-237-ncrona.aspx</link><pubDate>Sat, 02 Apr 2011 22:37:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:191553</guid><dc:creator>Gisela</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/rsscomments.aspx?PostID=191553</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/commentapi.aspx?PostID=191553</wfw:comment><comments>http://geeks.ms/blogs/gtorres/archive/2011/04/03/refrescar-un-webgrid-cada-x-tiempo-de-forma-as-237-ncrona.aspx#comments</comments><description>&lt;div&gt;Con la nueva versi&amp;oacute;n ASP.NET MVC 3, disponemos de una nueva extensi&amp;oacute;n para la creaci&amp;oacute;n de grids. Para conocer m&amp;aacute;s detalles sobre este nuevo helper pod&amp;eacute;is consultar &lt;a title="WebGrid en MVC 3, paso a paso" href="http://www.variablenotfound.com/2011/02/webgrid-en-mvc-3-paso-paso.html" target="_blank"&gt;el&amp;nbsp;art&amp;iacute;culo&lt;/a&gt; de Jose M. Aguilar &lt;img class="wp-smiley" alt=":)" src="http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif" /&gt;&lt;/div&gt;
&lt;div&gt;En este post me gustar&amp;iacute;a mostraros c&amp;oacute;mo es posible actualizar de forma as&amp;iacute;ncrona un grid cada un n&amp;uacute;mero determinado de segundos.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Del lado del servidor he adjuntado una base de datos con una &amp;uacute;nica tabla para el ejemplo que os quiero mostrar:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.returngis.net/wp-content/uploads/2011/03/Base-de-datos-de-prueba.png"&gt;&lt;img title="Base de datos de prueba" class="aligncenter size-full wp-image-1629" src="http://www.returngis.net/wp-content/uploads/2011/03/Base-de-datos-de-prueba.png" height="192" width="579" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;Un repositorio para recuperar los valores:&lt;/p&gt;
&lt;pre class="brush: csharp; title: ;"&gt;using System.Linq;

namespace WebGridAsync.Models
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class StuffRepository
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private readonly StuffEntities _model;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public StuffRepository()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _model = new StuffEntities();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public FileViewModel GetFiles(int page = 1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var fileViewModel = new FileViewModel();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var files = _model.Files.ToList();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileViewModel.FilesPerPages = 5;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileViewModel.NumberOfFiles = _model.Files.Count();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileViewModel.Files = files.Skip((page - 1) * fileViewModel.FilesPerPages)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Take(fileViewModel.FilesPerPages);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return fileViewModel;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void SaveChanges()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _model.SaveChanges();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;
&lt;div&gt;Y por &amp;uacute;ltimo un controlador donde lo que vamos a actualizar es el estado de los archivos en cada llamada:&lt;/div&gt;
&lt;pre class="brush: csharp; title: ;"&gt;using System.Web.Mvc;
using WebGridAsync.Models;

namespace WebGridAsync.Controllers
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class HomeController : Controller
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private readonly StuffRepository _stuffRepository;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public HomeController()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _stuffRepository = new StuffRepository();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ActionResult Index(int page = 1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return View(GetFilesWithUpdatedStatus());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public FileViewModel GetFilesWithUpdatedStatus()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var fileViewModel = _stuffRepository.GetFiles();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var myFile in fileViewModel.Files)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (myFile.Status)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;quot;Pending&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myFile.Status = &amp;quot;Processing&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;quot;Processing&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myFile.Status = &amp;quot;Waiting&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;quot;Waiting&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myFile.Status = &amp;quot;More waiting...&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &amp;quot;More waiting...&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myFile.Status = &amp;quot;Completed&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myFile.Status = &amp;quot;Pending&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _stuffRepository.SaveChanges();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return fileViewModel;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;
&lt;div&gt;Por &amp;uacute;ltimo, necesitamos crear una vista donde hagamos uso del helper WebGrid. Es importante que el mismo est&amp;eacute; incluido en un div con un id asociado.&lt;/div&gt;
&lt;pre class="brush: xml; highlight: [9]; title: ;"&gt;@model WebGridAsync.Models.FileViewModel
@{
&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewBag.Title = &amp;quot;Async WebGrid&amp;quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp; WebGrid grid = new WebGrid(rowsPerPage: Model.FilesPerPages, canSort: false);
&amp;nbsp;&amp;nbsp;&amp;nbsp; grid.Bind(Model.Files, rowCount: Model.NumberOfFiles);
}
&amp;lt;h2&amp;gt;@ViewBag.Message&amp;lt;/h2&amp;gt;
&amp;lt;div id=&amp;quot;myWebGrid&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @grid.GetHtml(columns: new[]{
&amp;nbsp;&amp;nbsp;&amp;nbsp; grid.Column(&amp;quot;Name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp; grid.Column(&amp;quot;Date&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp; grid.Column(&amp;quot;Status&amp;quot;)
})
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;div&gt;Para hacer la llamada as&amp;iacute;ncrona, necesitamos utilizar algo de c&amp;oacute;digo javascript, con la ayuda de JQuery. En la misma p&amp;aacute;gina que el grid anterior incluimos lo siguiente:&lt;/div&gt;
&lt;pre class="brush: jscript; highlight: [12]; title: ;"&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $.ajaxSetup({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cache: false
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setTimeout(reloadAsync, 5000);
&amp;nbsp;&amp;nbsp;&amp;nbsp; });

&amp;nbsp;&amp;nbsp;&amp;nbsp; function reloadAsync() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&amp;quot;#myWebGrid&amp;quot;).load(&amp;quot;/Home/Index #myWebGrid&amp;quot;, function (response, status, xhr) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (status == &amp;quot;error&amp;quot;) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var msg = &amp;quot;Sorry but there was an error: &amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&amp;quot;#error&amp;quot;).html(msg + xhr.status + &amp;quot; &amp;quot; + xhr.statusText);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setTimeout(reloadAsync, 5000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });

&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;div&gt;Lo que estamos haciendo en realidad es inicializar un timer para que cada 5 segundos solicite los datos al servidor. El m&amp;eacute;todo load de JQuery va a realizar una llamada a la acci&amp;oacute;n Index del controlador Home para que este le devuelva la p&amp;aacute;gina renderizada. Una vez obtiene el resultado va a localizar el elemento div myWebGrid para reemplazar el que se est&amp;aacute; visualizando actualmente por el nuevo resultado.&lt;/div&gt;
&lt;div&gt;Adjunto el proyecto por si fuera de utilidad &lt;img class="wp-smiley" alt=":D" src="http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif" /&gt; &lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align:right;"&gt;&lt;a href="http://www.returngis.net/wp-content/uploads/2011/03/WebGridAsync.zip"&gt;&lt;img title="WebGridAsync.zip" src="http://www.returngis.net/wp-content/uploads/2010/09/download-icon.png" height="64" width="64" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&amp;iexcl;Saludos! &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191553" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/gtorres/archive/tags/ASP.NET+MVC+3/default.aspx">ASP.NET MVC 3</category></item><item><title>Google Maps API v.3.0 y ASP.NET MVC 3 con Razor</title><link>http://geeks.ms/blogs/gtorres/archive/2011/02/10/google-maps-api-v-3-0-y-asp-net-mvc-3-con-razor.aspx</link><pubDate>Thu, 10 Feb 2011 16:12:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:188777</guid><dc:creator>Gisela</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/rsscomments.aspx?PostID=188777</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/commentapi.aspx?PostID=188777</wfw:comment><comments>http://geeks.ms/blogs/gtorres/archive/2011/02/10/google-maps-api-v-3-0-y-asp-net-mvc-3-con-razor.aspx#comments</comments><description>&amp;nbsp;
&lt;div style="text-align:center;"&gt;&lt;img title="google Maps" src="http://www.returngis.net/wp-content/uploads/2011/02/google-Maps.png" width="240" height="180" alt="" /&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;Gracias a todas las &lt;a title="Directorio de APIs de Google" href="http://code.google.com/intl/es-ES/more/" target="_blank"&gt;APIs&lt;/a&gt; que nos facilita Google, podemos hacer uso pr&amp;aacute;cticamente de todos los servicios que ofrece la compa&amp;ntilde;&amp;iacute;a a&amp;nbsp;d&amp;iacute;a de hoy. En este post en concreto me gustar&amp;iacute;a hablaros de c&amp;oacute;mo utilizar el API de Google Maps en su versi&amp;oacute;n 3.0 para generar mapas din&amp;aacute;micos con una enorme cantidad de funciones. Adem&amp;aacute;s, para rizar m&amp;aacute;s el rizo utilizar&amp;eacute; &lt;a title="Razor View Engine para ASP.NET MVC 3" href="http://www.returngis.net/2011/02/razor-view-engine-para-asp-net-mvc/" target="_blank"&gt;ASP.NET MVC 3 con Razor&lt;/a&gt; para crear una llamada s&amp;iacute;ncrona y otra as&amp;iacute;ncrona con la ayuda de &lt;a title="P&amp;aacute;gina oficial de JQuery" href="http://jquery.com/" target="_blank"&gt;JQuery&lt;/a&gt;.&lt;/div&gt;
&lt;h3&gt;Referencias&lt;/h3&gt;
&lt;div&gt;Para utilizar el API de Google Maps son necesarias las siguientes referencias:&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;&amp;lt;script src=&amp;quot;@Url.Content(&amp;quot;~/Scripts/jquery-1.4.4.min.js&amp;quot;)&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://maps.google.com/maps/api/js?sensor=false&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;div&gt;&lt;i&gt;&lt;b&gt;Nota&lt;/b&gt;: Cuando utilizas Google Maps &lt;b&gt;siempre debe especificarse si vas a utilizar un sensor&lt;/b&gt;, por ejemplo un GPS, para determinar la ubicaci&amp;oacute;n del usuario (importante para los dispositivos m&amp;oacute;viles). En este caso estableceremos el valor del par&amp;aacute;metro&amp;nbsp;sensor a false ya que no entra este escenario dentro del post &lt;img class="wp-smiley" alt=";)" src="http://www.returngis.net/wp-includes/images/smilies/icon_wink.gif" /&gt; &lt;/i&gt;&lt;/div&gt;
&lt;h3&gt;&amp;iquest;Por d&amp;oacute;nde empiezo?&lt;/h3&gt;
&lt;div&gt;Lo primero que debemos tener en cuenta es que podemos&lt;b&gt; ubicar marcas de dos formas distintas&lt;/b&gt;: &lt;b&gt;Indicando las coordenadas del sitio o recuperando las coordenadas a trav&amp;eacute;s de una direcci&amp;oacute;n postal&lt;/b&gt;. Sin embargo, en el segundo caso tenemos una limitaci&amp;oacute;n por parte de la API, la cual s&amp;oacute;lo nos permite solicitar unas 10 direcciones por consulta, lo cual limita nuestro campo de acci&amp;oacute;n. En este post utilizaremos coordenadas para poder agregar tantas marcas como sea necesario &lt;img class="wp-smiley" alt=":D" src="http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif" /&gt; Para ello, he creado un objeto de prueba que almacenar&amp;aacute; todas las marcas y un repositorio,&amp;nbsp; tambi&amp;eacute;n de prueba, que nos devolver&amp;aacute;&amp;nbsp;tres objetos dentro de una lista para la demo.&lt;/div&gt;
&lt;h3&gt;Objeto de prueba&lt;/h3&gt;
&lt;pre class="brush: csharp; title: ;"&gt;namespace GoogleMapsASPNETMVC3.Models
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class GoogleMarker
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string SiteName { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public double Latitude { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public double Longitude { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string InfoWindow { get; set; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/pre&gt;
&lt;h3&gt;Repositorio de prueba&lt;/h3&gt;
&lt;pre class="brush: csharp; title: ;"&gt;using System.Collections.Generic;

namespace GoogleMapsASPNETMVC3.Models
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class MarkerRepository
&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IList&amp;lt;GoogleMarker&amp;gt; GetMarkers()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var googleMarkers = new List&amp;lt;GoogleMarker&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new GoogleMarker
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SiteName = &amp;quot;Jardines de Sabatini&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Latitude = 40.421749,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Longitude = -3.713994,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InfoWindow = &amp;quot;InfoWindow de los Jardines de Sabatini&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new GoogleMarker
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SiteName = &amp;quot;Campo del Moro&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Latitude = 40.419658,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Longitude = -3.718801,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InfoWindow = &amp;quot;InfoWindow del Campo del Moro&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new GoogleMarker
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SiteName = &amp;quot;Parque de la Cornisa&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Latitude = 40.413254,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Longitude = -3.716483,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InfoWindow = &amp;quot;InfoWindow del Parque de la Cornisa&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return googleMarkers;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;
&lt;h3&gt;Llamada s&amp;iacute;ncrona&lt;/h3&gt;
&lt;div&gt;Para la llamada s&amp;iacute;ncrona lo que vamos a hacer es solicitar la lista de marcas y pasarla a la&amp;nbsp;vista para poder asociarla a la propiedad Model.&lt;/div&gt;
&lt;pre class="brush: csharp; title: ;"&gt;[HttpGet]
public ActionResult Sync()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return View(_markerRepository.GetMarkers());
}
&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;Una vez en la vista agregaremos el siguiente c&amp;oacute;digo:&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;@model IEnumerable&amp;lt;GoogleMapsASPNETMVC3.Models.GoogleMarker&amp;gt;
@using System.Threading;
@using System.Globalization;
@{
&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewBag.Title = &amp;quot;Sync&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.CurrentThread.CurrentCulture = new CultureInfo(&amp;quot;en-US&amp;quot;);
}
&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function () {
&amp;nbsp;&amp;nbsp;&amp;nbsp; var bounds = new google.maps.LatLngBounds();
&amp;nbsp;&amp;nbsp;&amp;nbsp; var options = {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; zoom : 14,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mapTypeId: google.maps.MapTypeId.TERRAIN
&amp;nbsp;&amp;nbsp;&amp;nbsp; };
&amp;nbsp;&amp;nbsp;&amp;nbsp; var googleMap = new google.maps.Map($(&amp;quot;#map&amp;quot;)[0],options);
&amp;nbsp;&amp;nbsp;&amp;nbsp; var infoWindow = new google.maps.InfoWindow({ content: &amp;quot;Cargando...&amp;quot; });
&amp;nbsp;&amp;nbsp;&amp;nbsp; @foreach (var marker in Model)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;text&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var point = new google.maps.LatLng(@marker.Latitude, @marker.Longitude);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bounds.extend(point);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var marker = new google.maps.Marker({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; position: point,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; map: googleMap,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; icon:&amp;#39;/Content/images/cloud_marker.png&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; html: &amp;#39;@marker.InfoWindow&amp;#39;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; google.maps.event.addListener(marker, &amp;quot;click&amp;quot;, function () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; infoWindow.setContent(this.html);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; infoWindow.open(googleMap, this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/text&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; googleMap.fitBounds(bounds);
&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;lt;/script&amp;gt;
&amp;lt;h2&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Sync&amp;lt;/h2&amp;gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 800px; height: 500px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;div&gt;Lo primero que hacemos en la parte javascript&amp;nbsp;es la inicializaci&amp;oacute;n de unas variables bases como son &lt;b&gt;bounds&lt;/b&gt; donde vamos a insertar cada uno de los puntos de coordenadas, &lt;b&gt;googleMap&lt;/b&gt; que asignar&amp;aacute; el espacio dedicado al mapa a un div con id &amp;ldquo;map&amp;rdquo; situado&amp;nbsp;abajo del todo e &lt;b&gt;infoWindow&lt;/b&gt; que nos servir&amp;aacute; para asociar un pop up a cada marca del mapa.&lt;/div&gt;
&lt;div&gt;Posteriormente utilizamos la @ para inicializar un foreach, ya que estamos utilizando el motor de vistas Razor, y recorremos cada una de las marcas ubicadas en el Model del tipo GoogleMarker. Como vamos a mezclar c&amp;oacute;digo javascript con variables de servidor, debemos hacer el uso de &amp;lt;text&amp;gt;&amp;lt;/text&amp;gt; para que no interprete todo el c&amp;oacute;digo dentro del foreach como c&amp;oacute;digo de servidor.&lt;/div&gt;
&lt;div&gt;Los pasos que vamos a realizar en cada iteraci&amp;oacute;n es la creaci&amp;oacute;n de cada conjunto de coordenadas en el mapa a trav&amp;eacute;s de &lt;b&gt;google.maps.LatLng&lt;/b&gt; para acto seguido usar el resultado como la posici&amp;oacute;n de la marca en el objeto &lt;b&gt;google.maps.Marker&lt;/b&gt; en el mapa asociado. En este &amp;uacute;ltimo podemos asociar distintos tipos de opciones como por ejemplo el icono que queremos mostrar para dicha marca, sombreados, etc&amp;eacute;tera. En este caso he modificado la imagen por una nube &lt;img class="wp-smiley" alt=":)" src="http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif" /&gt; &lt;/div&gt;
&lt;div&gt;Adem&amp;aacute;s podemos asociar un evento a cada marca para mostrar el t&amp;iacute;pico pop up que aparece cuando haces clic sobre una de ellas. Para ello utilizaremos &lt;b&gt;google.maps.event.Listener&lt;/b&gt; donde crearemos la asociaci&amp;oacute;n con la clase InfoWindow instanciada al inicio del script.&lt;/div&gt;
&lt;div&gt;Por otro lado, si os fij&amp;aacute;is de nuevo en el c&amp;oacute;digo anterior, he cambiado &lt;b&gt;la cultura a en-US&lt;/b&gt;. Esto es debido a que es necesario respetar el signo de separaci&amp;oacute;n de los decimales en las coordenadas ya que, de lo contrario, la latitud y longitud recuperadas de la propiedad&amp;nbsp;Model se pintar&amp;iacute;an con comas y no se mostrar&amp;iacute;a correctamente.&lt;/div&gt;
&lt;div&gt;Como resultado obtendr&amp;iacute;amos la siguiente imagen &lt;img class="wp-smiley" alt=":D" src="http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif" /&gt; &lt;/div&gt;
&lt;div style="text-align:center;"&gt;&lt;img title="google maps sync" class="aligncenter size-full wp-image-1542" src="http://www.returngis.net/wp-content/uploads/2011/02/google-maps-sync.png" width="588" height="400" alt="" /&gt;&lt;/div&gt;
&lt;h3&gt;Llamada as&amp;iacute;ncrona&lt;/h3&gt;
&lt;div&gt;Para la llamada as&amp;iacute;ncrona el escenario cambia:&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;@{
&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewBag.Title = &amp;quot;Async&amp;quot;;
}
&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function () {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var bounds = new google.maps.LatLngBounds();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var options = {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; zoom: 14,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mapTypeId: google.maps.MapTypeId.TERRAIN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var googleMap = new google.maps.Map($(&amp;quot;#map&amp;quot;)[0], options);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var infoWindow = new google.maps.InfoWindow({ content: &amp;quot;Cargando...&amp;quot; });

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $.ajax({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type: &amp;quot;POST&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url: &amp;quot;GetMarkersAsync&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; datatype: &amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; success: function (data) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; data.length; i++) {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var point = new google.maps.LatLng(data[i].Latitude, data[i].Longitude);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bounds.extend(point);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var marker = new google.maps.Marker({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; position: point,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; map: googleMap,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; html: data[i].InfoWindow
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; google.maps.event.addListener(marker, &amp;quot;click&amp;quot;, function () {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; infoWindow.setContent(this.html);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; infoWindow.open(googleMap, this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; googleMap.fitBounds(bounds);
&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;lt;/script&amp;gt;
&amp;lt;h2&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Async&amp;lt;/h2&amp;gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 800px; height: 500px;&amp;quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;div&gt;En este segundo caso estamos utilizando JQuery para la llamada Ajax a una acci&amp;oacute;n llamada &lt;b&gt;GetMarkersAsync&lt;/b&gt;, la cual nos devolver&amp;aacute; un listado de objetos en &lt;a title="Wikipedia JSON" href="http://es.wikipedia.org/wiki/JSON" target="_blank"&gt;JSON&lt;/a&gt; con el mismo formato que nuestro objeto de prueba. Para ello, crearemos una acci&amp;oacute;n HttpPost que retorne dicho listado basado en la clase GoogleMarker.&lt;/div&gt;
&lt;pre class="brush: csharp; title: ;"&gt;[HttpPost]
public ActionResult GetMarkersAsync()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; return Json(_markerRepository.GetMarkers());
}&lt;/pre&gt;
&lt;div&gt;En este caso el resultado es el mismo que en la llamada s&amp;iacute;ncrona a excepci&amp;oacute;n de los iconos utilizados en las marcas, ya que en el segundo ejemplo he omitido la propiedad icon para que utilice el icono por defecto de Google.&lt;/div&gt;
&lt;div style="text-align:center;"&gt;&lt;img title="google maps async" class="aligncenter size-full wp-image-1543" src="http://www.returngis.net/wp-content/uploads/2011/02/google-maps-async.png" width="582" height="400" alt="" /&gt;&lt;/div&gt;
&lt;div&gt;Adjunto el proyecto por si fuera de utilidad &lt;img class="wp-smiley" alt=":D" src="http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif" /&gt; &lt;/div&gt;
&lt;div style="text-align:right;"&gt;&lt;a href="http://www.returngis.net/wp-content/uploads/2011/02/GoogleMapsASPNETMVC3.zip"&gt;&lt;img title="download-icon" src="http://www.returngis.net/wp-content/uploads/2010/09/download-icon.png" width="64" height="64" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align:right;"&gt;&lt;a title="Documentaci&amp;oacute;n oficial Google Maps API versi&amp;oacute;n 3" href="http://code.google.com/intl/es-ES/apis/maps/documentation/javascript/basics.html#Welcome" target="_blank"&gt;M&amp;aacute;s informaci&amp;oacute;n sobre la Google Map API 3.0&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&amp;iexcl;Saludos!​&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=188777" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/gtorres/archive/tags/ASP.NET+MVC+3/default.aspx">ASP.NET MVC 3</category></item><item><title>Razor View Engine para ASP.NET MVC 3</title><link>http://geeks.ms/blogs/gtorres/archive/2011/02/10/razor-view-engine-para-asp-net-mvc-3.aspx</link><pubDate>Thu, 10 Feb 2011 16:01:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:188774</guid><dc:creator>Gisela</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/rsscomments.aspx?PostID=188774</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/commentapi.aspx?PostID=188774</wfw:comment><comments>http://geeks.ms/blogs/gtorres/archive/2011/02/10/razor-view-engine-para-asp-net-mvc-3.aspx#comments</comments><description>&lt;div class="ExternalClassC1C88CD5494B43459A4B81BE2A45AFC8"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="tweetmeme_button" style="float:right;margin-left:10px;"&gt;&lt;a class="tm_button" href="http://www.returngis.net/2011/02/razor-view-engine-para-asp-net-mvc/" rel="&amp;amp;source=0GiS0&amp;amp;style=normal&amp;amp;service=bit.ly&amp;amp;service_api=R_192a8a6cd838616f48cba7b0d6445921&amp;amp;hashtags=ASP.NET+MVC+3,Razor&amp;amp;b=2"&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align:right;"&gt;&lt;img title="Razor" src="http://www.returngis.net/wp-content/uploads/2011/02/Razor.png" width="110" height="102" alt="" /&gt;&lt;/div&gt;
&lt;div&gt;Una de las novedades con mejor acogida de la nueva versi&amp;oacute;n del frameworkd &lt;a title="Sitio oficial de ASP.NET MVC" href="http://www.asp.net/mvc/mvc3" target="_blank"&gt;ASP.NET MVC 3&lt;/a&gt; ha sido sin duda el nuevo motor de vistas llamado &lt;b&gt;Razor&lt;/b&gt;. Si bien es cierto que con las primeras versiones y el motor de vistas aspx muchos programadores se echaban para atr&amp;aacute;s con ASP.NET MVC, con Razor podremos generar vistas de una forma m&amp;aacute;s sencilla y fluida. En este post voy a comentar algunas de las diferencias y mejoras respecto al anterior view engine predeterminado.&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;En primer lugar, Razor pasa a ser el motor de vistas por defecto, aunque&amp;nbsp;tenemos disponibles&amp;nbsp;ambos al crear un nuevo proyecto o una nueva vista.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align:center;"&gt;&lt;img title="New ASP.NET MVC 3 Project" class="aligncenter size-full wp-image-1418" src="http://www.returngis.net/wp-content/uploads/2011/02/New-ASP.NET-MVC-3-Project.png" width="511" height="468" alt="" /&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Accediendo a variables de servidor&lt;/h3&gt;
&lt;div&gt;Si record&amp;aacute;is, cuando trabajamos con el aspx view engine, para acceder al contenido de Model, ViewData, helpers, etc&amp;eacute;tera&amp;nbsp;necesit&amp;aacute;bamos a&amp;ntilde;adir las siguientes etiquetas: &amp;lt;%: %&amp;gt;&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;&amp;lt;p&amp;gt;Please enter your username and password. &amp;lt;%: Html.ActionLink(&amp;quot;Register&amp;quot;, &amp;quot;Register&amp;quot;) %&amp;gt;&lt;br /&gt;if you don&amp;#39;t have an account.&amp;lt;/p&amp;gt;&lt;/pre&gt;
&lt;div&gt;Con Razor simplemente utilizaremos &lt;b&gt;@&lt;/b&gt; al inicio y el view engine se encargar&amp;aacute; de determinar hasta d&amp;oacute;nde debe procesar.&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;&amp;lt;p&amp;gt;Please enter your username and password. @Html.ActionLink(&amp;quot;Register&amp;quot;, &amp;quot;Register&amp;quot;) if&lt;br /&gt;you don&amp;#39;t have an account.&amp;lt;/p&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Recorrer una lista&lt;/h3&gt;
&lt;div&gt;Para recorrer una lista es bastante similar a como lo har&amp;iacute;amos con el motor aspx, con la diferencia del etiquetado para comenzar la sentencia foreach.&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;@foreach (var item in Model) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Html.ActionLink(&amp;quot;Edit&amp;quot;, &amp;quot;Edit&amp;quot;, new { id=item.Id }) |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Html.ActionLink(&amp;quot;Details&amp;quot;, &amp;quot;Details&amp;quot;, new { id=item.Id }) |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Html.ActionLink(&amp;quot;Delete&amp;quot;, &amp;quot;Delete&amp;quot;, new { id=item.Id })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @item.FirstName&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @item.LastName&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @item.Address&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @item.E_Mail&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @item.Mobile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;}&lt;/pre&gt;
&lt;div&gt;Si nos fijamos en la llave de cierre del bucle, vemos que en Razor no es necesario etiquetar esa llave &lt;img class="wp-smiley" alt=":D" src="http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif" /&gt; ya que se supone que pertenece a la llave de apertura abierta anteriormente, caso que no ocurr&amp;iacute;a con aspx view engine:&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;&amp;lt;% foreach (var item in Model) { %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%: Html.ActionLink(&amp;quot;Edit&amp;quot;, &amp;quot;Edit&amp;quot;, new { id=item.Id }) %&amp;gt; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%: Html.ActionLink(&amp;quot;Details&amp;quot;, &amp;quot;Details&amp;quot;, new { id=item.Id }) %&amp;gt; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%: Html.ActionLink(&amp;quot;Delete&amp;quot;, &amp;quot;Delete&amp;quot;, new { id=item.Id }) %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%: item.FirstName %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%: item.LastName %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%: item.Address %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%: item.E_Mail %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%: item.Mobile %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;% } %&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Bloques de c&amp;oacute;digo&lt;/h3&gt;
&lt;div&gt;Por otro lado, para utilizar bloques de c&amp;oacute;digo bastar&amp;aacute; con utilizar la arroba y abrir llaves para delimitar el espacio abarcado por el bloque.&lt;/div&gt;
&lt;pre class="brush: csharp; title: ;"&gt;@{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewBag.Title = &amp;quot;Loop&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Layout = &amp;quot;~/Views/Shared/_Layout.cshtml&amp;quot;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;h3&gt;Tag &amp;lt;text&amp;gt;&lt;/h3&gt;
&lt;div&gt;Otro escenario que se nos puede presentar es que dentro de un bloque de c&amp;oacute;digo necesitemos a&amp;ntilde;adir c&amp;oacute;digo javascript o HTML que no requiera ser procesado por el motor.&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; To learn more about ASP.NET MVC visit &amp;lt;a href=&amp;quot;http://asp.net/mvc&amp;quot; title=&amp;quot;ASP.NET MVC Website&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://asp.net/mvc&amp;lt;/a&amp;gt;.&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;@if (DateTime.Now.Year == 2011)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;text&amp;gt;while year is 2011 this should be shown.&amp;lt;/text&amp;gt;&lt;br /&gt;}&lt;/pre&gt;
&lt;div&gt;Para que nos hagamos una idea m&amp;aacute;s clara, si no a&amp;ntilde;adimos el tag &amp;lt;text&amp;gt;, algunas partes del c&amp;oacute;digo anterior ser&amp;iacute;a interpretadas como palabras clave.&lt;/div&gt;
&lt;div style="text-align:center;"&gt;&lt;img title="without text" class="aligncenter size-full wp-image-1492" src="http://www.returngis.net/wp-content/uploads/2011/02/without-text.png" width="724" height="136" alt="" /&gt;&lt;/div&gt;
&lt;h3&gt;Archivo _ViewStart.cshtml&lt;/h3&gt;
&lt;div&gt;Para conseguir unas vistas m&amp;aacute;s limpias y concisas, aparece un nuevo archivo llamado &lt;b&gt;_ViewStart.cshtml&lt;/b&gt;.&lt;/div&gt;
&lt;div style="text-align:center;"&gt;&amp;nbsp;&lt;img title="ViewStart" class="aligncenter size-full wp-image-1501" src="http://www.returngis.net/wp-content/uploads/2011/02/ViewStart.png" width="199" height="354" alt="" /&gt;&lt;/div&gt;
&lt;div&gt;El objetivo del mismo trata de recopilar c&amp;oacute;digo com&amp;uacute;n a todas las vistas de la aplicaci&amp;oacute;n, simplificando el c&amp;oacute;digo de las mismas. Por defecto aparece definido en &amp;eacute;l el layout utilizado en las vistas, en caso de no ser especificado en las mismas.&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;@{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Layout = &amp;quot;~/Views/Shared/_Layout.cshtml&amp;quot;;&lt;br /&gt;}&lt;/pre&gt;
&lt;h3&gt;Sections&amp;nbsp;&lt;/h3&gt;
&lt;div&gt;Otra de las novedades dentro de Razor es la posibilidad de crear secciones.&lt;/div&gt;
&lt;pre class="brush: xml; highlight: [28]; title: ;"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link href=&amp;quot;@Url.Content(&amp;quot;~/Content/Site.css&amp;quot;)&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src=&amp;quot;@Url.Content(&amp;quot;~/Scripts/jquery-1.4.4.min.js&amp;quot;)&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id=&amp;quot;title&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My MVC Application&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id=&amp;quot;logindisplay&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Html.Partial(&amp;quot;_LogOnPartial&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id=&amp;quot;menucontainer&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ul id=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;@Html.ActionLink(&amp;quot;Home&amp;quot;, &amp;quot;Index&amp;quot;, &amp;quot;Home&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;@Html.ActionLink(&amp;quot;About&amp;quot;, &amp;quot;About&amp;quot;, &amp;quot;Home&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id=&amp;quot;main&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @RenderBody()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @RenderSection(&amp;quot;returngis&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;Cuando definimos una secci&amp;oacute;n en el layout, el objetivo principal es que la misma pueda ser modificada din&amp;aacute;micamente dependiendo de la vista que solicitemos de la siguiente manera.&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;@section returngis{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Este es un ejemplo para &amp;lt;a href=&amp;quot;http://www.returngis.net&amp;quot;&amp;gt;Returng(GiS);&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;div&gt;Si tenemos varias vistas dependiendo del anterior layout y no todas asignan un valor a la secci&amp;oacute;n definida anteriormente, al acceder a alguna de las vistas sin esta definici&amp;oacute;n saltar&amp;iacute;a la siguiente excepci&amp;oacute;n:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align:center;"&gt;&lt;img title="Section not defined" class="aligncenter size-full wp-image-1506" src="http://www.returngis.net/wp-content/uploads/2011/02/Section-not-defined.png" width="449" height="317" alt="" /&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Este error ocurre debido a que, por defecto, cuando se define una secci&amp;oacute;n se da por hecho que la misma debe estar implementada en cualquier vista que utilice este layout. Para evitar esto, basta con modificar la definici&amp;oacute;n de la secci&amp;oacute;n agregando el par&amp;aacute;metro false al final para convertir la secci&amp;oacute;n de obligatorio a opcional.&lt;/div&gt;
&lt;pre class="brush: xml; title: ;"&gt;@RenderSection(&amp;quot;returngis&amp;quot;, false)&lt;/pre&gt;
&lt;h3&gt;Nuevos helpers&lt;/h3&gt;
&lt;div&gt;Por &amp;uacute;ltimo, y no por ello menos importante &lt;img class="wp-smiley" alt=":D" src="http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif" /&gt; , se a&amp;ntilde;aden a nuestra lista de helpers 5 m&amp;aacute;s, algunos de ellos imprescindibles:&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Chart&lt;/b&gt;: A partir de la versi&amp;oacute;n 3 no necesitaremos crear un chart from scratch como hac&amp;iacute;amos en este &lt;a title="ASP.NET Chart Controls y ASP.NET MVC 2" href="http://www.returngis.net/2010/03/asp-net-chart-controls-y-asp-net-mvc-2/" target="_blank"&gt;antiguo post&lt;/a&gt;. Este helper renderiza exactamente las mismas caracter&amp;iacute;sticas que en ASP.NET 4.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WebGrid&lt;/b&gt;: Un helper m&amp;aacute;s que necesario el cual renderiza un grid con paginaci&amp;oacute;n y ordenaci&amp;oacute;n. Gracias a Jos&amp;eacute; M. Aguilar tenemos un &lt;a title="WebGrid en ASP.NET MVC 3 paso a paso" href="http://www.variablenotfound.com/2011/02/webgrid-en-mvc-3-paso-paso.html" target="_blank"&gt;tutorial&lt;/a&gt; de este helper explicando paso a paso cada una de las funcionalidades.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Crypto&lt;/b&gt;: Utilizado para crear password hash.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WebImage&lt;/b&gt;: Se utiliza para renderizar im&amp;aacute;genes.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WebMail&lt;/b&gt;: Nos ayuda en el env&amp;iacute;o de emails.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;Espero que sea de utilidad &lt;img class="wp-smiley" alt=":D" src="http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif" /&gt; &lt;/div&gt;
&lt;div&gt;&amp;iexcl;Saludos!&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=188774" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/gtorres/archive/tags/ASP.NET+MVC+3/default.aspx">ASP.NET MVC 3</category></item></channel></rss>