Sei que o XHTML não suporta tags de formulário aninhadas e já li outras respostas aqui no Stack Overflow sobre esse assunto, mas ainda não descobri uma solução elegante para o problema.
Alguns dizem que você não precisa e que eles não conseguem pensar em um cenário onde isso seria necessário. Bem, pessoalmente, não consigo pensar em um cenário que não precisei.
Vamos ver um exemplo muito simples:
Você está criando um aplicativo de blog e possui um formulário com alguns campos para criar uma nova postagem e uma barra de ferramentas com "ações" como "Salvar", "Excluir", "Cancelar".
<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>
Nosso objetivo é escrever o formulário de uma maneira que não exija JavaScript , basta usar o formulário HTML antigo e enviar botões.
Como o URL da ação é definido na tag Form e não em cada botão de envio individual, nossa única opção é postar em um URL genérico e iniciar "if ... then ... else" para determinar o nome do botão que foi submetido. Não é muito elegante, mas é a nossa única opção, pois não queremos confiar no JavaScript.
O único problema é que pressionar "Excluir" enviará TODOS os campos do formulário no servidor, mesmo que a única coisa necessária para essa ação seja uma entrada Oculta com o ID da postagem. Não é grande coisa neste pequeno exemplo, mas tenho formulários com centenas (por assim dizer) de campos e guias em meus aplicativos LOB que (por causa dos requisitos) precisam enviar tudo de uma só vez e, de qualquer forma, isso parece muito ineficiente e um desperdício. Se o aninhamento de formulários fosse suportado, eu seria capaz de quebrar o botão de envio "Excluir" dentro de seu próprio formulário, apenas com o campo pós-identificação.
Você pode dizer "Basta implementar o" Excluir "como um link em vez de enviar". Isso seria errado em muitos níveis, mas o mais importante é que ações de efeito colateral como "Excluir" aqui nunca devem ser uma solicitação GET.
Portanto, minha pergunta (principalmente para aqueles que dizem que não precisavam de aninhamento de formulários) é O que você faz? Existe alguma solução elegante que estou faltando ou o resultado final é realmente "Exija JavaScript ou envie tudo"?