Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Класс ViewResult является наиболее часто возвращаемым результатом действий контроллера. Он производит рендеринг представления в веб-страницу и возвращает ее в виде ответа клиенту.
Чтобы возвратить объект ViewResult используется метод View:
public class HomeController : Controller { public ActionResult Index() { return View(); } }
Вызов метода View возвращает объект ViewResult. Затем уже ViewResult производит рендеринг определенного представления в ответ. По умолчанию контроллер производит поиск представления в проекте по следующему пути: /Views/Имя_контроллера/Имя_представления.cshtml
Согласно настройкам по умолчанию, если представление не указано явным образом, то в качестве представления будет использоваться то, имя которого совпадает с именем действия контроллера. Например, вышеопределенное действие Index по умолчанию будет производить поиск представления Index.cshtml в папке /Views/Home/.
Однако можно также задать имя представления явным образом:
public class HomeController : Controller { public ViewResult SomeMethod() { return View("Index"); } }
В итоге в качестве представления будет выбрано представление /Views/Home/Index.cshtml. Мы также можем полностью переопределить путь, по которому система будет искать представление:
public class HomeController : Controller { public ViewResult SomeMethod() { return View("~/Views/Some/Index.cshtml"); } }
Правда, если такого пути не окажется, то приложение выбросит ошибку.
Существуют различные способы передачи данных из контроллера в представление. Один из них представляет использование объекта ViewData.
ViewData представляет словарь из пар ключ-значение:
public ViewResult SomeMethod() { ViewData["Head"] = "Привет мир!"; return View("SomeView"); }
В этом случае в представлении SomeView.cshtml можно получить передаваемую строку следующим образом:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>SomeView</title> </head> <body> <div> <h2>@ViewData["Head"]</h2> </div> </body> </html>
Еще один способ передачи данных представляет объект ViewBag. Этот объект позволяет определить различные свойства и присвоить им любое значение. Так, мы могли бы переписать предыдущий пример следующим образом:
public ViewResult SomeMethod() { ViewBag.Head = "Привет мир!"; return View("SomeView"); }
И таким же образом изменить представление:
............................ <body> <div> <h2>@ViewBag.Head</h2> </div> </body> </html>
И не важно, что изначально объект ViewBag не содержит никакого свойства Head, оно определяется динамически. При этом свойства ViewBag могут содержать не только простые объекты типа string или int, но и сложные данные. Так, в примере из прошлой главы мы добавляли в объект ViewBag список объектов модели:
public ActionResult Index() { IEnumerable<Book> books = db.Books; ViewBag.Books = books; return View(); }
Хотя ViewData и ViewBag и похожи, в то же время они не полностью эквивалентны. Так, например, нельзя передавать динамические значения из
ViewBag в методы расширения в представлениях. Например, мы не можем написать
@Html.TextBox("name", ViewBag.Name)
, так как компилятор C# должен знать тип каждого параметра во время компиляции, чтобы выбрать
нужный метод расширения. В этом случае нам надо либо использовать ViewData:@Html.TextBox("name", ViewData["Name"])
, либо применить
приведение типов: @Html.TextBox("name", (string)ViewBag.Name)
И еще один способ предлагает объект TempData. TempData представляет словарь, хранящий пары ключ-значение, как и ViewData, но его использование немного отличается. TempData позволяет сохранять переданное значение в течении всего текущего запроса. Использование TempData аналогично работе с ViewData.