Вывод динамических данных

Например, перед нами стоит задача выводить приветствие в зависимости от времени суток. Т.е. до обеда — «Доброе утро», после обеда — «Добрый день», и т.д. Для того, чтобы решить эту задачу наиболее грамотным образом, нам нужно передавать данные из контроллера в представление. Это можно сделать с помощью объекта ViewBag, который является членом базового класса ControllerBase.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace PartyInvites.Controllers
{
    public class HomeController : Controller
    {
        public ViewResult Index()
        {
            int hour = DateTime.Now.Hour;
            if(hour >= 4 && hour < 12) ViewBag.Greeting = "Доброе утро";
            if(hour >= 12 && hour < 18) ViewBag.Greeting = "Добрый день";
            if(hour >= 18 && hour < 22) ViewBag.Greeting = "Добрый вечер";
            if(hour >= 22 || hour < 4) ViewBag.Greeting = "Доброй ночи";
            return View();
        }
    }
}

Сразу остановлюсь на условной конструкции, чтобы не было недопонимания. Кто-то может подумать: «Фу, какой код, его же можно оптимизировать, добавив сюда else.» Да, соглашусь, код можно оптимизировать так, чтобы процессорное время тратилось меньше. Но, во-первых, процессор не взорвётся от прохода по четырём строчкам. Во-вторых, добавлять сюда else — это бред полнейший, потому что читать это будет невозможно. Нет, возможно, конечно, но я не хочу сидеть и компилировать в голове код. Код пишется в первую очередь для разработчика, и сейчас он очень понятен. Если хочется его оптимизировать, то нужно написать функцию.

[функция]

Теперь вернёмся к объекту ViewBag. Как видите, в нём можно устанавливать произвольные свойства. Это динамический объект, так что свойство Greeting не существует вплоть до момента, когда ему присваивается значение. Ну и, соответственно, засовывать в него можно всё, что угодно.

Теперь перейдём в Index.cshtml. Чтобы получить значение, которое вычислится в контроллере, нужно сослаться на свойство ViewBag.Greeting.

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <p>@ViewBag.Greeting! [абзац сгенерирован в представлении]</p>
    </div>
</body>
</html>

Давайте запустим приложение. Что произошло? В контроллере Home произошёл вызов метода Index(). Этот метод, в свою очередь, вызвал метод View(). Инфраструктура MVC нашла файл представления Index.cshtml и запросила у движка Razor синтаксический анализ содержимого этого файла. Движок Razor нашёл вот это выражение и вставил вместо него значение, которое было вычислено в методе действия Index().

В следующем видео покажу, как работать с системой управления версиями.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

четыре × 3 =