Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Использование класса RssResult ничем не отличается от применения других вариантов классов ActionResult. Добавим действие Rss в контроллер AdminControiier так, как показано во фрагменте:

[AcceptVerbs(HttpVerbs.Get)]

public RssResult Rss

{

MembershipProvider mp = Membership.Provider;

int userCount;

var users = mp.GetAllUsers(0, Int32.MaxValue, out userCount);

List<SyndicationItem> items = new List<SyndicationItem>;

if (userCount > 0)

{

string bodyTemplate = @"email: {0}, comment: {1},

last activity: {2}, is locked: {3}, is approved: {4}";

foreach (MembershipUser item in users)

{

string body = String.Format(bodyTemplate, item.Email,

item. Comment, item. LastActivityDate,

item.IsLockedOut, item.IsApproved);

items.Add(new SyndicationItem(item.UserName, body, null));

}

}

SyndicationFeed feed = new SyndicationFeed("Cписок

пользователей",

"http://localhost/rss", Request.Url, items);

return new RssResult(feed);

}

Обратите внимание, что это действие возвращает результат в виде экземпляра класса RssResult, которому передается сгенерированный RSS-поток. После того как мы реализовали RssResult и действие Rss, можно попытаться запросить результат этого действия через браузер, перейдя по относительной ссылке /Admin/Rss. В итоге вы должны получить результат в виде RSS-потока, похожий на тот, который изображен на рис. 4.11.

Создание своих вариантов ActionResult — это исключительно мощное средство для расширения базовой функциональности MVC Framework. Реализуя свои экземпляры ActionResult, вы сможете генерировать ответ на клиентский запрос в любой форме с любой структурой данных.

Model Binding

После того как механизм MVC Framework получил запрос от клиента с набором некоторых параметров, произвел определение необходимого контроллера и действия, возникает задача сопоставления параметров запроса параметрам выбранного действия контроллера. Задача решается просто, когда параметров немного. В этом случае сопоставление параметров происходит по их наименованию: параметрам метода действия с определенным именем присваиваются значения параметров запроса с теми же именами. В качестве примера рассмотрим действие Update контроллера AdminController. Во фрагменте приведено определение метода с параметрами:

public ActionResult Update(Guid? userid, string email,

string comment, bool isApproved, bool isLockedOut)

Для этого действия подразумевается, что при его вызове будут переданы параметры с именами: userid, email, comment, isApproved, isLockedOut. Такие параметры передаются

с запросом при отправлении формы с нашего представления Select. В следующем фрагменте рассмотрим основной HTML-код формы этого представления, который отображается в браузере пользователя:

<form action="/Admin/Update" method="post">

...

<input id="userId" name="userId" type="hidden"

value="a4530eee-8634-4258-ac00-0ea63f7cc783" />

...

<input id="email" name="email" type="text" value="vyunev@live.ru" />

...

<textarea cols="20" id="comment" name="comment" rows="2">

<b&gt,Добрый день!</b>

</textarea>

...

<input checked="checked" id="isApproved"

name="isApproved" type="checkbox" value="true" />

...

<input id="isLockedOut" name="isLockedOut"

type="checkbox" value="true" />

...

<input type="submit" value="Coxpaнить" />

</form>

После того как пользователь нажмет кнопку Сохранить, данные с формы отправляются на сервер в виде параметров с именами, определенными в разметке атрибутами name. После этого задача сопоставления параметров становится тривиальной.

Но что делать, когда форма содержит десятки вводимых полей? Неужели создавать десятки параметров у метода действия контроллера? Нет, MVC Framework содержит механизм, который позволяет избежать такого некрасивого шага, как многочисленные параметры метода. Такой механизм называется Model Binding (привязка модели). Чтобы продемонстрировать работу этого механизма, выполним ряд изменений в коде. Для начала определим комплексный тип, который будет содержать все необходимые данные, передаваемые в действие Update:

public class UserData

{

public Guid? UserId { get; set; }

public string Email { get; set; }

public string Comment { get; set; }

public bool IsApproved { get; set; }

public bool IsLockedOut { get; set; }

}

Обратите внимание, что для определения параметров мы используем свойства. Механизм Model Binding требует, чтобы использовались свойства, но не простые поля. Соответственно данному типу изменим определение метода Update:

public ActionResult Update(UserData userData)

{

if (!userData.UserId.HasValue)

throw new HttpException(404, "Пользователь не найден");

MembershipProvider mp = Membership.Provider;

MembershipUser user = mp.GetUser(userData.UserId, false);

user.Email = userData.Email;

user.Comment = userData.Comment;

user.IsApproved = userData.IsApproved;

if (user.IsLockedOut && !userData.IsLockedOut)

Поделиться:
Популярные книги

"Фантастика 2025-4". Компиляция. Книги 1-26

Бриз Илья
Фантастика 2025. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2025-4. Компиляция. Книги 1-26

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Александр I

Сахаров Андрей Николаевич
16. Романовы. Династия в романах
Проза:
историческая проза
5.00
рейтинг книги
Александр I

Бастард

Осадчук Алексей Витальевич
1. Последняя жизнь
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.86
рейтинг книги
Бастард

Сборник рассказов "Рождественское Чудо" 2021

Пьянкова Карина Сергеевна
Любовные романы:
современные любовные романы
любовно-фантастические романы
5.00
рейтинг книги
Сборник рассказов Рождественское Чудо 2021

Кетополис: Киты и броненосцы

Грин Грэй Ф.
1. Кетополис
Фантастика:
социально-философская фантастика
научная фантастика
стимпанк
7.78
рейтинг книги
Кетополис: Киты и броненосцы

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

60-я параллель

Успенский Лев Васильевич
Проза:
военная проза
5.00
рейтинг книги
60-я параллель

Эльфы. Во власти тьмы

Баркли Джеймс
Эльфы
Фантастика:
боевая фантастика
5.50
рейтинг книги
Эльфы. Во власти тьмы

Немецкий детектив

Кирст Ханс
Детективы:
прочие детективы
5.00
рейтинг книги
Немецкий детектив

Сборник.Том 2

Азимов Айзек
2. Отцы-основатели. Весь Азимов
Фантастика:
научная фантастика
5.00
рейтинг книги
Сборник.Том 2

Королевская кровь - 2

Котова Ирина Владимировна
Фантастика:
героическая фантастика
5.60
рейтинг книги
Королевская кровь - 2

Джон Голсуорси. Собрание сочинений в 16 томах. Том 15

Голсуорси Джон
15. Собрание сочинений
Проза:
классическая проза
5.00
рейтинг книги
Джон Голсуорси. Собрание сочинений в 16 томах. Том 15

Рассвет русского царства 3

Грехов Тимофей
3. Новая Русь
Фантастика:
историческое фэнтези
альтернативная история
5.00
рейтинг книги
Рассвет русского царства 3