Vistas dinámicas frente a las vistas fuertemente tipadas
Por Rick Anderson
Hay tres maneras de pasar información de un controlador a una vista en ASP.NET MVC 3:
- Como objeto de modelo fuertemente tipado.
- Como tipo dinámico (mediante @model dinámico)
- Uso de ViewBag
He escrito una sencilla aplicación MVC 3 Top Blog para comparar y contrastar vistas dinámicas y fuertemente tipadas. El controlador comienza con una lista sencilla de blogs:
using System.Collections.Generic;
using System.Web.Mvc;
namespace Mvc3ViewDemo.Controllers {
public class Blog {
public string Name;
public string URL;
}
public class HomeController : Controller {
List<Blog> topBlogs = new List<Blog>
{
new Blog { Name = "ScottGu", URL = "http://weblogs.asp.net/scottgu/"},
new Blog { Name = "Scott Hanselman", URL = "http://www.hanselman.com/blog/"},
new Blog { Name = "Jon Galloway", URL = "http://www.asp.net/mvc"}
};
public ActionResult IndexNotStonglyTyped() {
return View(topBlogs);
}
public ActionResult About() {
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
}
}
Haga clic con el botón derecho en el método IndexNotStonglyTyped() y agregue una vista de Razor.
Asegúrese de que la casilla Crear una vista fuertemente tipada no esté activada. La vista resultante no contiene mucho:
@{
ViewBag.Title = "IndexNotStonglyTyped";
}
<h2>IndexNotStonglyTyped</h2>
On the first line of the Views\Home\IndexNotStonglyTyped.cshtml file, add the model directive and the dynamic keyword.
@model dynamic
Dado que estamos usando una vista dinámica y no una vista fuertemente tipada, IntelliSense no nos ayuda. A continuación se muestra el código completado:
@model dynamic
@{
ViewBag.Title = "IndexNotStonglyTyped";
}
<h2>Index Not Stongly Typed</h2>
<p>
<ul>
@foreach (var blog in Model) {
<li>
<a href="@blog.URL">@blog.Name</a>
</li>
}
</ul>
</p>
Ahora agregaremos una vista fuertemente tipada. Agregue el código siguiente al controlador:
public ActionResult StonglyTypedIndex() {
return View(topBlogs);
}
Observe que es exactamente el mismo valor devuelto View(topBlogs); llame como vista no fuertemente tipada. Haga clic con el botón derecho en StonglyTypedIndex() y seleccione Agregar vista. Esta vez, seleccione la clase Modelo de blog y seleccione Lista como plantilla Scaffolding.
Dentro de la nueva plantilla de vista se obtiene compatibilidad con IntelliSense.