Asp.net mvc framework
Шрифт:
В результате создается разметка, содержащая теги <option>.
<select id="lstName" name="lstName">
<option>John</option>
<option>Paul</option>
<option>George</option>
<option>Rringo</option>
</select>
Для обеспечения возможности выбора нескольких элементов в списках, генерируемых методом ListBox, в качестве параметра следует передать коллекцию MultiSelectList.
<%= Html.ListBox("lstName",
new MultiSelectList( new[] {"John", "Paul", "George", "Rringo"} )) %>
Тогда будет определено свойство multiple тега <select>.
<select id="lstName" multiple="multiple" name="lstName">
<option>John</option>
<option>Paul</option>
<option>George</option>
<option>Rringo</option>
</select>
Разумеется, в реальных приложениях не всегда удобно создавать отдельно список для элементов форм и хотелось бы использовать коллекцию бизнесобъектов, применяемых в логике приложения. Для этого может быть использован конструктор коллекции SelectList.
SelectList(коллекция объектов,
название поля объекта, содержащее значение,
название поля объекта, содержащее текст,
выбранное значение
)
Например, в нашем приложении используются объекты типа Person, определение которых представлено далее.
public class Person {
public int Id { get; set; }
public string Name { get; set; }
}
Тогда в методе контроллера для сохранения в коллекцию ViewData коллекцию элементов списка можно передать, используя конструктор SelectList так, как показано далее.
public ActionResult About
{
List<Person> lst = new List<Person>
{
new Person { Id = 1, Name = "John"},
new Person { Id = 2, Name = "Paul"},
new Person { Id = 3, Name = "George"},
new Person { Id = 4, Name = "Ringo"}
};
ViewData["lstName"] = new SelectList(lst, "Id", "Name", 2);
return View ;
}
В результате будет создана HTML-разметка, приведенная далее.
<select id="lstName" multiple="multiple" name="lstName">
<option value="1">John</option>
<option selected="selected" value="2">Paul</option>
<option value="3">George</option>
<option value="4">Ringo</option>
</select>
Таким образом, коллекция бизнес-объектов может быть использована для заполнения списков необходимыми данными.
Индикаторы корректности введенных данных
Пользователям свойственно ошибаться при вводе данных, и приложению необходимо уведомлять пользователя о допущенных ошибках и конкретных полях формы, которые заполнены некорректно. Для этого существуют два вспомогательных метода: Html.validationMessage, который выводит сообщение, относящееся к определенному полю на форме, и Html.validationSummary , который выводит общую информацию по ошибкам, допущенным при заполнении формы.
Работа этих вспомогательных методов основана на коллекции ModelState, которая упоминалась ранее. В этой коллекции на этапе проверки корректности данных сохраняется информация об ошибках, связанных с конкретными полями формы. Пример действия контроллера, выполняющего проверку корректности введенных данных (валидацию), приведен в листинге 5.7.
Листинг 5.7. Пример валидации данных
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Product obj, int id)
{
if (obj.UnitsOnOrder < 0)
ModelState.AddModelError("UnitsOnOrder",
"Количество заказанных единиц товара не может
быть отрицательным.");
if (obj.UnitsInStock < 0)
ModelState.AddModelError("UnitsInStock",
"Количество единиц товара на складе должно быть не
отрицательным.");
if (obj.UnitPrice <= 0)
ModelState.AddModelError("UnitPrice",
"Цена должна быть больше нуля.");
if (!ModelState.IsValid)
{
// есть ошибки, еще раз
// показать форму редактирования
return View(obj);
}
else
{
// ошибок нет, сохранить
db.SaveProduct(obj);
return RedirectToAction("Index");
}
}
Процесс валидации прост — выполняется проверка условий и в случае наличия ошибок в коллекцию Modelstate добавляется информация в виде пары "идентификатор элемента — описание допущенной ошибки". Если в коллекцию Modelstate добавлена хотя бы одна такая пара, то значение свойства Modelstate.isValid будет установлено в false. В случае если ошибки допущены, то необходимо снова отобразить то же представление, которое использовалось для радактирования данных, и передать ему те данные, которые были введены пользователем на предыдущем шаге. Пример такого представления, работающего с кодом, описанным в листинге 5.7, показан в листинге 5.8, там же приведено строго типизированное представление, в качестве модели использующее класс Product.
Листинг 5.8. Представление Edit.aspx
<%@ Page Title="" Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<MvcViewsDemo.Models.Product>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent"
runat="server">
Edit
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>
Редактирование сведений о товаре
</h2>
<%= Html.ValidationSummary("npи редактировании сведений
о товаре произошли ошибки.") %>
<% using (Html.BeginForm)
{%>
<fieldset>
<legend>Редактирование сведений о товаре</legend>
<label for="ProductID">
Код продукта:
</1аЬе1>
<%= Model.ProductID.ToString %>
<%= Html.Hidden("ProductId", Model.ProductID)%>
Сталин
Документальная литература:
биографии и мемуары
рейтинг книги
Принадлежать им
Любовные романы:
современные любовные романы
рейтинг книги
Грозовой замок
7. Громовая поступь
Фантастика:
фэнтези
героическая фантастика
рпг
рейтинг книги
Газлайтер. Том 12
12. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
рейтинг книги
Эволюционер из трущоб. Том 10
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
рейтинг книги
Рухнувший мир
2. Студент
Фантастика:
фэнтези
рейтинг книги
Третий Генерал: Том V
4. Третий Генерал
Фантастика:
городское фэнтези
аниме
сказочная фантастика
попаданцы
рейтинг книги
На границе империй. Том 8. Часть 2
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
рейтинг книги
Гражданская кампания
12. Сага о Форкосиганах
Фантастика:
космическая фантастика
рейтинг книги