UR.ANUS
Asp.net mvc framework
вернуться

Магдануров Гайдар Ильдарович

Шрифт:

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)

user.UnlockUser;

mp.UpdateUser(user);

return RedirectToAction("Index");

}

Теперь, чтобы механизм MVC Framework смог произвести сопоставление параметров с помощью встроенного механизма Model Binding, нам необходимо модифицировать код представления Select так, как показано в следующем фрагменте:

<% using (Html.BeginForm("Update", "Admin")) { %>

<%= Html.Hidden("userData.UserId", (Guid)user.ProviderUserKey)%>

<%= Html.AntiForgeryToken %>

<fieldset>

<legend>Данные</legend>

<label for="email">Email</label>

<%=Html.TextBox("userData.Email", user.Email)%>

<label for="comment">Комментарий</label>

<%=Html.TextArea("userData.Comment", user.Comment)%>

<label for="isApproved">

<%=Html.CheckBox("userData.IsApproved", user.IsApproved)%>

подтвержден

</label>

<label for="isLockedOut">

<%=Html.CheckBox("userData.IsLockedOut", user.IsLockedOut)%>

заблокирован

</label>

</fieldset>

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

<% } %>

Обратите внимание на то, что для всех полей формы мы использовали наименование вида userData.Свойство. Например, поле email стало полем с именем userData.Email. Такое именование позволяет классу DefaultModelBinder, механизму Model Binding по умолчанию, сопоставить множественные параметры формы комплексному типу UserData.

Примечание

Строго говоря, в данном случае вам необязательно указывать для элементов формы префикс userData. Так как в сопоставлении участвует только один параметр комплексного типа, то механизм DefaultModelBinder автоматически определит значения его свойств, предположив, что все элементы формы относятся к единственному параметру userData. Однако мы рекомендуем указывать подобный префикс в любом случае для повышения читаемости кода и возможности более простого расширения кода в будущем.

  • Читать дальше
  • 1
  • ...
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • ...

UR.ANUS - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • support@anus.bid