3.7. using в Razor

Когда модель представления, которую мы получаем из внешнего источника содержит какие-то объекты, для обращения к их классам придется писать в представлении полное название. Например:

@foreach (MyWebSite.Model.Person p in Model)
{
  <li>@p.LastName @p.LastName (@p.Age) </li>
}

Я тут решил явно указать тип переменной MyWebSite.Model.Person в цикле, хотя большинство сейчас просто использует var. Оба варианта рабочие, но если вы не хотите каждый раз писать MyWebSite.Model.Person, то можно подключить пространство имен так же, как и в C# коде с помощью using, просто в представлении перед этим ключевым словом нужно поставить символ @:

@using MyWebSite.Model
@foreach (Person p in Model)
{
  <li>@p.LastName @p.LastName (@p.Age) </li>
}

В C# ключевое слово using может использоваться в двух значениях – для подключения пространств имен и для указания область видимости для объектов классов, которые реализуют интерфейс IDisposable. Здесь та же песня, только с @

@using (Html.BeginForm()) {	
 // Здесь будет форма
}

Это классический способ использования @using в представлениях с IDisposable. Html - это такой помощник, у которого есть методы, которые прячут HTML от программистов. Если честно, я не очень люблю это, но это мое личное мнение, я предпочитаю чистый HTML. Я считаю, что в представлении должна быть минимальная привязка к C# коду.

Но рассмотрим этот код и что он делает. У помощника Html есть метод BeginForm. Он выведет на страницу тэг <form> и вернет в качестве результата объект класса MvcForm, который в недрах фреймворка объявлен так:

public class MvcForm : IDisposable

У интерфейса IDisposable есть метод Dispose(). Когда объект этого типа уже не нужен системе, то вызывается метод Dispose, который проверяет, если открытый тэг не был закрыт, то его нужно закрыть и вывести на страницу </form>. Другими словами, когда мы выйдем за границы видимости @using, система закроет форму и в html коде мы увидим:

<form>
 // Здесь будет форма
</form>

На самом деле там будут еще атрибуты action и method, а так же токен безопасности, но это все тема отдельного разговора про помощник Html. Пока опустим это, потому что разговор идет имено о @using.

Без using то же самое можно было бы сделать так:

@{var form = Html.BeginForm();} 
// Здесь будет форма
@{form.EndForm();} 

Здесь я явно открыл и закрыл форму методами BeginForm и EndForm соответственно. Как мы уже знаем, метод BeginForm возвращает объект, который я сохранил в переменной form, и когда форма уже не нужна, я вызываю метод EndForm этого объекта.

Следующая глава

4.0. Представления в .NET

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне