ViewResult и генерация представлений

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Класс 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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850