Динамические и строго типизированные представления

Рик Андерсон

Существует три способа передачи данных из контроллера в представление в ASP.NET MVC 3:

  1. Как строго типизированный объект модели.
  2. Как динамический тип (с использованием @model dynamic)
  3. Использование ViewBag

Я написал простое приложение MVC 3 Top Blog для сравнения и контраста динамических и строго типизированных представлений. Контроллер начинается с простого списка блогов:

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();
        }
    }
}

Щелкните правой кнопкой мыши метод IndexNotStonglyTyped() и добавьте представление Razor.

8475.NotStronglyTypedView[1]

Убедитесь, что флажок Создать строго типизированное представление не установлен. Результирующее представление не содержит много:

@{
    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

Так как мы используем динамическое, а не строго типизированное представление, intellisense не помогает нам. Готовый код показан ниже:

@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>

6646.NotStronglyTypedView_5F00_IE[1]

Теперь мы добавим строго типизированное представление. Добавьте в контроллер следующий код:

public ActionResult StonglyTypedIndex() {
    return View(topBlogs);
}

Обратите внимание, что это точно так же возвращается View(topBlogs); вызов в качестве представления, не являющегося строго типизированным. Щелкните правой кнопкой мыши элемент StonglyTypedIndex() и выберите Добавить представление. На этот раз выберите класс Blog Model (Модель блога ) и выберите List (Список ) в качестве шаблона шаблонов.

5658.StrongView[1]

В новом шаблоне представления мы получаем поддержку Intellisense.

7002.IntelliSense[1]