Сімейство Formвитягує значення елементів форми, надісланих у тілі HTTP-запиту, за допомогою форми, яка використовує метод POST.
Синтаксис
Request.Form(елемент) [(індекс) |.Count]
Параметри
елемент
Ім'я елемента форми, з якої сімейство має значення.
індекс
Необов'язковий параметр, який дозволяє отримати доступ до одного з кількох значень параметра. Можливо будь-яким цілим числом у діапазоні від –1 до Request.Form(параметр).Count.
Примітки
Сімейство Formіндексується за іменами параметрів у запиті. Значення Request.Form(element) є масивом усіх значень елемента,які зустрічаються у тілі запиту. Можна визначити кількість значень параметра, викликавши Request.Form(елемент).Count. Якщо параметр не має кількох значень, пов'язаних з ним, лічильник дорівнює 1. Якщо параметр не знайдено, лічильник дорівнює 0.
Для посилання на окреме значення елемента форми, що має кілька значень, необхідно вказати значення для індексу. Параметр індексможе бути будь-яким числом у діапазоні від 1 до Request.Form(елемент).Count. Якщо посилаються на один із кількох параметрів форми без вказівки значення індексу, дані повертаються у вигляді рядка, розділеного комами.
Коли Request.Formвикористовується з параметрами, веб-сервер здійснює аналіз тіла HTTP-запиту та повертає зазначені дані. Якщо програма вимагає нерозібраних даних із форми, можна звернутися до них, викликавши Request.Formбез параметрів.
Примітка. При роботі з ASP та надсилання великих обсягів даних, що перевищують 100 Кбайт, метод Request.Formвикористовувати не можна. Якщо програмі потрібно надіслати дані, що виходять за цю межу, можна створити компонент, який використовує метод Request.BinaryRead.
Можна перебирати всі дані в запиті форми. Наприклад, якщо користувач заповнює форму, вказуючи два значення – Chocolate та Butterscotch – для елемента FavoriteFlavor, можна вилучити ці значення за допомогою сценарію, наведеного нижче.
For i = 1 To Request.Form("FavoriteFlavor").Count
Response.Write Request.Form("FavoriteFlavor")(i) & "
"
Наведений вище сценарій відображатиме наступну інформацію.
Цей прийом можна використовувати для відображення імені параметра, як показано в сценарії, наведеному нижче.
For i = 1 to Request.Form("FavoriteFlavor").count%>
Request.Form(FavoriteFlavor) =<%= Request.Form("FavoriteFlavor")(i)_
%>
Цей сценарій відображає в браузері наступне:
Request.Form(FavoriteFlavor) = Chocolate
Request.Form(FavoriteFlavor) = Butterscotch
приклад
Розглянемо таку форму:
На малюнку показано, як ця проста сторінка виглядатиме у вікні веб-браузера:
Коли користувач клацає на кнопці Submit (Надіслати), браузер витягує поточні значення кожного елемента керування та формує з них довгий рядок. Потім цей рядок надсилається сторінці, вказаній у дескрипторі
Останнє оновлення: 31.10.2015
Хоча ми можемо самі написати будь-який хелпер, але фреймворк MVC вже надає великий набір вбудованих html-хелперів, які дозволяють генерувати ту чи іншу розмітку, головним чином, для роботи з формами. Тому в більшості випадків не доведеться створювати свої хелпери, і можна буде скористатися вбудованими.
Хелпер Html.BeginForm
Для створення форм ми цілком можемо використовувати стандартні елементи HTML, наприклад:
Це звичайна html-форма, яка за натисканням на кнопку надсилає всі введені дані запитом POSTна адресу / Home / Buy. Вбудований хелпер BeginForm/EndForm дозволяє створити ту саму форму:
Введіть своє ім'я |
|
Введіть адресу: |
|
Метод BeginForm приймає як параметри ім'я методу дії та ім'я контролера, а також тип запиту. Цей хелпер створює як відкриваючий тег
. Тому при рендерингу подання у вихідний потік у нас вийде той же HTML-код, що і з застосуванням тега form. Тому обидва способи ідентичні.Тут є один момент. Якщо у нас у контролері визначено дві версії одного методу – для методів POST та GET, наприклад:
Public ActionResult Buy() ( return View(); ) public string Buy(Purchase purchase) ( .............. return "Дякую за покупку книги";; )
Тобто фактично виклик сторінки з формою та відправлення форми здійснюється однією і тією ж дією Buy. У цьому випадку можна не вказувати в хелпері Html.BeginForm параметри:
@using(Html.BeginForm()) ( ............. )
Введення інформації
У попередньому прикладі разом із хелпером Html.BeginForm використовувалися стандартні елементи html. Однак набір html-хелперів також містить хелпери для введення інформації користувачем. У MVC визначено широкий набір хелперів уведення практично для кожного html-елемента. Що вибрати - хелпер або стандартний елемент введення html, вже вирішує сам розробник.
Незалежно від типу, всі базові html-хелпери використовують як мінімум два параметри: перший параметр застосовується для встановлення значень для атрибутів id і name , а другий параметр - для встановлення значення атрибута value
Html.TextBox
Хелпер Html.TextBox генерує тег input зі значенням атрибута type рівним text . Хелпер TextBox використовують для отримання введення користувачем інформації. Так, перепишемо попередню форму із заміною полів введення на хелпер Html.TextBox:
@using(Html.BeginForm("Buy", "Home", FormMethod.Post)) (
Введіть своє ім'я:
@Html.TextBox("Person", "Введіть ім'я")Введіть адресу:
@Html.TextBox("Address", "Введіть адресу") }Ми отримаємо той самий результат:
Html.TextArea
Хелпер TextArea використовується для створення елемента
буде наступна html-розмітка:
Зверніть увагу, що хелпер декодує значення, що міститься в нього, в тому числі і html-теги, (усі хелпери декодують значення моделей і значення атрибутів). Інші версії хелпера TextArea дозволяють вказати кількість рядків та стовпців, що визначають розмір текстового поля.
@Html.TextArea("text", "привіт
світ", 5, 50, null)
Цей хелпер згенерує таку розмітку:
Html.Hidden
У прикладі з формою ми використовували приховане поле input type="hidden", замість якого могли б повністю використовувати хелпер Html.Hidden. Так, наступний виклик хелпера:
@Html.Hidden("BookId", "2")
згенерує розмітку:
А при передачі змінної з ViewBag нам треба привести її до типу string: @Html.Hidden("BookId", @ViewBag.BookId as string)
Html.Password
Html.Password створює поле для введення пароля. Він схожий на хелпер TextBox, але замість введених символів відображає маску пароля. Наступний код:
@Html.Password("UserPassword", "val")
генерує розмітку:
Html.RadioButton
Для створення перемикачів застосовується хелпер Html.RadioButton. Він генерує елемент input із значенням type="radio" . Для створення групи перемикачів, треба присвоїти всім їм одне й те саме ім'я (властивість name):
@Html.RadioButton("color", "red") червоний
@Html.RadioButton("color", "blue") синій
@Html.RadioButton("color", "green", true) зелений
Цей код створює наступну розмітку:
червоний
синій
зелений
Html.CheckBox
Html.CheckBox може застосовуватися для створення одразу двох елементів. Візьмемо, наприклад, наступний код:
@Html.CheckBox("Enable", false)
Цей вираз генеруватиме наступний HTML:
Тобто, крім власне поля прапорця, ще й генерується приховане поле. Навіщо воно потрібне? Справа в тому, що браузер посилає значення прапорця лише тоді, коли прапорець вибраний або позначений. А приховане поле гарантує, що для елемента Enable буде встановлено значення навіть якщо користувач не відзначив прапорець.
Html.Label
Хелпер Html.Label створює елемент , а параметр, що передається в хелпер, визначає значення атрибута for і одночасно текст на елементі. Перевантажена версія хелпера дозволяє визначити значення атрибута for та текст на мітці незалежно один від одного. Наприклад, оголошення хелпера Html.Label("Name") створює наступну розмітку:
Елемент label представляє просту мітку, призначену для прикріплення інформації до елементів введення, наприклад текстових полів. Атрибут для елемента label повинен містити ID асоційованого елемента введення. Якщо користувач натискає на мітку, браузер автоматично передає фокус пов'язаному з цією міткою елементу введення.
Html.DropDownList
Хелпер Html.DropDownList створює список, що випадає, тобто елемент . Для створення такого списку потрібна колекція об'єктів SelectListItem , які представляють елементи списку. Об'єкт SelectListItem має властивості Text (текст, що відображається), Value (саме значення, яке може не збігатися з текстом) і Selected . Можна створити колекцію об'єктів SelectListItem або використати хелпер SelectList. Цей хелпер переглядає об'єкти IEnumerable і перетворять їх на послідовність об'єктів SelectListItem . Так, код @Html.DropDownList("countires", new SelectList(new string ("Russia", "USA", "Canada", "France")), "Countries") генерує наступну розмітку:
Тепер більше складний приклад. Виведемо до списку колекцію елементів Book. У контролері передамо цей список через ViewBag:
BookContext db = новий BookContext(); Public ActionResult Index() ( SelectList books = new SelectList(db.Books, "Author", "Name"); ViewBag.Books = books; return View(); )
Тут ми створюємо об'єкт SelectList, передаючи в його конструктор набір значень для списку (db.Books), назву властивості моделі Book, яка буде використовуватися як значення (Author), та назва властивості моделі Book, яка використовуватиметься для відображення у списку. В даному випадку необов'язково встановлювати дві різні властивості, можна було й одну встановити і для значення та відображення.
Тоді в поданні ми можемо використовувати цей SelectList:
@Html.DropDownList("Author", ViewBag.Books як SelectList)
І при рендерингу представлення всі елементи SelectList додадуться до списку, що випадає
Html.ListBox
Хелпер Html.ListBox, як і DropDownList, створює елемент , але у своїй уможливлює множинне виділення елементів (тобто атрибута multiple встановлюється значення multiple). Для створення списку, який підтримує множинне виділення, замість SelectList можна використовувати клас MultiSelectList:
@Html.ListBox("countires", new MultiSelectList(new string ("Росія", "США", "Китай", "Індія"))))
Цей код генерує таку розмітку:
З передачею одиночних значень сервер все зрозуміло, але як передати множинні значення? Припустимо, у нас є така форма:
@using (Html.BeginForm()) ( @Html.ListBox("countries", new MultiSelectList(new string ( "Росія", "США", "Китай", "Індія"))))
}Тоді метод контролера міг би отримувати ці значення так:
Public string Index(string countries) ( string result = ""; foreach (string c in countries) ( result += c; result += ";"; ) return "Ви вибрали: " + result; )
Форма з кількома кнопками
Як правило, на формі є лише одна кнопка для надсилання. Однак у певних ситуаціях може виникнути потреба використовувати більше однієї кнопки. Наприклад, є поле для введення значення, а дві кнопки вказують, чи треба це значення видалити або, навпаки, додати:
@using (Html.BeginForm("MyAction", "Home", FormMethod.Post)) (
}
Найпростіше рішення у тому, що кожної кнопки встановлюється однакове значення атрибута name , але різне для атрибута value . А метод, що набуває форми, може виглядати так:
Public ActionResult MyAction(string product, string action) ( if(action=="add") ( ) else if(action=="delete") ( ) // решта коду методу )
І за допомогою умовної конструкції в залежності від значення параметра action, який зберігає значення атрибута value натиснутої кнопки, виконуються певні дії.