Wiem, że XHTML nie obsługuje zagnieżdżonych znaczników formularzy i przeczytałem już tutaj inne odpowiedzi na temat przepełnienia stosu dotyczące tego tematu, ale wciąż nie znalazłem eleganckiego rozwiązania tego problemu.
Niektórzy twierdzą, że nie potrzebujesz go i że nie mogą wymyślić scenariusza, gdyby był on potrzebny. Cóż, osobiście nie mogę wymyślić scenariusza, w którym go nie potrzebowałem.
Zobaczmy bardzo prosty przykład:
Tworzysz aplikację blogową i masz formularz z kilkoma polami do tworzenia nowego postu oraz pasek narzędzi z „czynnościami”, takimi jak „Zapisz”, „Usuń”, „Anuluj”.
<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>
Naszym celem jest napisanie formularza w sposób niewymagający JavaScript , tylko zwykły stary formularz HTML i przyciski przesyłania.
Ponieważ adres URL akcji jest zdefiniowany w znaczniku Form, a nie w każdym przycisku wysyłania, naszą jedyną opcją jest opublikowanie pod ogólnym adresem URL, a następnie rozpoczęcie „jeśli ... to ... inaczej”, aby określić nazwę przycisku, który został złożony. Niezbyt elegancki, ale nasz jedyny wybór, ponieważ nie chcemy polegać na JavaScript.
Jedynym problemem jest to, że naciśnięcie „Usuń” spowoduje przesłanie WSZYSTKICH pól formularza na serwerze, mimo że jedyną rzeczą potrzebną do wykonania tej akcji jest Ukryte wejście z identyfikatorem post-id. Niezbyt duża sprawa w tym małym przykładzie, ale mam formularze z setkami (że tak powiem) pól i zakładek w moich aplikacjach LOB , które (z powodu wymagań) muszą przesyłać wszystko za jednym razem, a w każdym razie wydaje się to bardzo nieefektywne i marnotrawstwo. Gdyby obsługiwane było zagnieżdżanie formularzy, mógłbym przynajmniej owinąć przycisk wysyłania „Usuń” wewnątrz własnego formularza tylko polem post-id.
Możesz powiedzieć „Po prostu zaimplementuj„ Usuń ”jako link zamiast przesyłać”. Byłoby to niewłaściwe na tak wielu poziomach, ale co najważniejsze, ponieważ działania niepożądane, takie jak „Usuń” tutaj, nigdy nie powinny być żądaniem GET.
Więc moje pytanie (szczególnie do tych, które mówią, że nie potrzebują zagnieżdżania formularzy) brzmi: co robisz? Czy jest jakieś eleganckie rozwiązanie, którego mi brakuje, a sedno brzmi: „Wymagaj JavaScript lub prześlij wszystko”?