Я знаю, що XHTML не підтримує вкладені теги форм, і я вже читав тут інші відповіді на "Переповнення стека" щодо цієї теми, але я все ще не знайшов елегантного рішення проблеми.
Деякі кажуть, що вам це не потрібно, і що вони не можуть придумати сценарій, якщо це було б потрібно. Ну, особисто я не можу придумати сценарій, якого я не мав потрібен.
Давайте подивимось дуже простий приклад:
Ви створюєте додаток для блогу, і у вас є форма з деякими полями для створення нової публікації та панелі інструментів з "діями", такими як "Зберегти", "Видалити", "Скасувати".
<form
action="/post/dispatch/too_bad_the_action_url_is_in_the_form_tag_even_though_conceptually_every_submit_button_inside_it_may_need_to_post_to_a_diffent_distinct_url"
method="post">
<input type="text" name="foo" /> <!-- several of those here -->
<div id="toolbar">
<input type="submit" name="save" value="Save" />
<input type="submit" name="delete" value="Delete" />
<a href="/home/index">Cancel</a>
</div>
</form>
Наша мета - написати форму таким чином, що не вимагає JavaScript , просто звичайну стару HTML-форму та кнопки подання.
Оскільки URL-адреса дії визначена в тезі форми, а не в кожній окремій кнопці подання, наш єдиний варіант - опублікувати загальну URL-адресу, а потім запустити "якщо ... то ... інше", щоб визначити назву кнопки, яка було подано. Не дуже елегантний, але єдиний наш вибір, оскільки ми не хочемо покладатися на JavaScript.
Єдина проблема полягає в тому, що натискаючи кнопку "Видалити", на сервер будуть подані ВСІ поля форми, хоча єдине, що потрібно для цієї дії, - це прихований вхід з повідомленням post-id. У цьому маленькому прикладі не дуже велика справа, але в моїх додатках LOB є форми із сотнями (так би мовити) полів і вкладок, які (через вимоги) повинні подавати все за один раз, і в будь-якому випадку це здається дуже неефективним і відходи. Якщо підтримка вклади форми підтримується, я, принаймні, зможу загорнути кнопку "Видалити" для надсилання всередину власної форми лише з полем "ідентифікатор".
Ви можете сказати "Просто реалізуйте" Видалити "як посилання, а не надсилати". Це було б помилково на багатьох рівнях, але найголовніше, оскільки дії побічних ефектів, такі як "Видалити" тут, ніколи не повинні бути GET-запитом.
Тож моє запитання (особливо до тих, хто каже, що їм не потрібна форма гніздування): «Що ви робите? Чи є якесь елегантне рішення, яке мені не вистачає, або підсумок справді "Або вимагати JavaScript, або надіслати все"?