Дочерние действия

62

Дочерние действия - это методы действий, вызываемые внутри представления. Они позволяют избежать повторения логики контроллера, которую нужно использовать во многих местах приложения. Дочерние действия соотносятся с действиями таким же образом, как частичные представления с представлениями. Дочернее действие может понадобиться, когда необходимо отображать определенный управляемый данными виджет (графический элемент), который должен располагаться на многих страницах и содержать данные, не зависящие от главного действия.

В примере приложения GameStore такой подход применялся для помещения на каждую страницу навигационного меню, управляемого данными, без необходимости в получении навигационных данных непосредственно из каждого метода действия. Навигационные данные получаются независимо дочерним действием.

Создание дочернего действия

Любое действие может использоваться как дочернее. Для демонстрации средства дочерних действий в контроллер Home добавлен новый метод действия, показанный в примере ниже:

using System;
using System.Web.Mvc;

namespace WorkingWithRazor.Controllers
{
    public class HomeController : Controller
    {
        // ...

        [ChildActionOnly]
        public ActionResult Time()
        {
            return PartialView(DateTime.Now);
        }
    }
}

Метод действия называется Time() и визуализирует частичное представление путем вызова метода PartialView(). Атрибут ChildActionOnly гарантирует, что метод действия может быть вызван только как дочерний метод в рамках представления. Метод действия не обязан иметь этот атрибут, чтобы использоваться в качестве дочернего действия, но предпочтительнее применять его, чтобы воспрепятствовать вызову таких методов действий в виде результата пользовательского запроса.

Имея определенный метод действия, необходимо создать частичное представление, которое будет визуализировано при вызове действия. Дочерние действия, как правило, ассоциируются с частичными представлениями, хотя обязательным это не является. В примере ниже показано представление /Views/Home/Time.cshtml, созданное в целях демонстрации. Это строго типизированное частичное представление, моделью представления которого является объект DateTime:

@model DateTime

<p>Сейчас: @Model.ToShortTimeString()</p>

Визуализация дочернего действия

Дочерние действия вызываются с применением вспомогательного метода Html.Action(). С его помощью выполняется метод действия, обрабатывается ViewResult и вывод внедряется в ответ, предназначенный для клиента. В примере ниже приведены изменения, внесенные в файл /Views/Common/List.cshtml с целью визуализации дочернего действия:

@{
    ViewBag.Title = "List";
    Layout = null;
}

<em>Это файл представления <b>~/Views/Common/List.cshtml</b></em>
<br /><br />

@Html.Partial("MyPartial")
@Html.Partial("MyStronglyTypedPartial",
    new List<string> { "Яблоко", "Апельсин", "Груша" })
@Html.Action("Time")

Чтобы просмотреть результаты визуализации дочернего действия, необходимо запустить приложение и снова перейти на URL вида /Home/List:

Использование дочернего действия

При вызове вспомогательного метода Action() в примере выше предоставляется одиночный параметр, который указывает имя вызываемого метода действия. Это приводит к тому, что MVC Framework ищет метод действия в контроллере, обрабатывающем текущий запрос. Для вызова методов действий из других контроллеров понадобится указать имя контроллера, например:

@Html.Action("Time", "SomeController")

Передавать параметры методам действий можно путем предоставления объекта анонимного типа, свойства которого соответствуют именам параметров дочернего метода действия. Таким образом, например, если есть следующее дочернее действие:

[ChildActionOnly]
public ActionResult Time(DateTime time)
{
    return PartialView(time);
}

то его можно вызвать из представления так, как показано ниже:

@Html.Action("Time", new { time = DateTime.Now })
Пройди тесты
Лучший чат для C# программистов