2009-12-09 6 views
0

J'ai un formulaire avec plusieurs onglets. Chaque onglet a son propre <form>, défini comme ceci:Que doit renvoyer l'action lors de la soumission de plusieurs formulaires dans une application MVC?

<% Using Html.BeginForm("Save", "FirstSection")%> 

J'ai un maître bouton Enregistrer qui présente toutes les formes sur la page comme ceci:

$("form").each(function() { $(this).submit(); }); 

Le problème est que je don sais pas ce que chaque action Enregistrer doit retourner:

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Save(ByVal data As MyTable) As ActionResult 
    SaveTheDataHere() 
    Return View() 
End Function 

Si je Return View() ça va échouer parce que je n'ai pas « get » équivalent pour l'action Enregistrer. Ce que je veux vraiment que le poste à faire est rien - juste enregistrer les données et être fait.

Y a-t-il une meilleure valeur de retour à utiliser?

Répondre

3

Ce:

$("form").each(function() { $(this).submit(); }); 

est-ce pas une bonne idée. La première soumission rechargera la page et les autres formulaires pourraient ne pas être soumis. Les meilleures solutions:

  1. place tous les contrôles de formulaire dans une forme et utiliser javascript pour afficher/masquer l'onglet actif. Un seul bouton de soumission soumettra toutes les données des onglets.
  2. Utilisez une vue différente pour chaque onglet.
+0

Le problème est que je ne charge que les onglets quand ils sont vus, parce que le chargement de tous les onglets tout le temps ralentit tout. Si j'ai un grand formulaire, tous les champs ne seront pas chargés, donc mon Save pensera que les champs non chargés devraient être masqués. – gfrizzle

+0

Dans ce cas, votre action Sauvegarder doit être assez intelligente pour voir la différence entre le champ vide et le champ qui n'existe pas dans le formulaire. Le classeur de modèle par défaut dans MVC fait cela - quand vous appelez votre contrôleur UpdateModel (modèle) seulement les champs existant dans la demande sont mis à jour. Vous pouvez charger uniquement le premier onglet par défaut, puis étendre le formulaire avec ajax chaque fois que l'utilisateur cliquera sur un nouvel onglet, et publier le formulaire entier avec un bouton de soumission. Le classeur modèle ne mettra à jour que les champs existants. – PanJanek

0

Vous pouvez renvoyer un simple JsonResult avec un message d'état. Ce serait une bonne pratique de toute façon, car alors vous sauriez si quelque chose a échoué avec vos messages de formulaire.

public JsonResult Save() 
{ 
    SaveTheDataHere() 
    return Json("Success"); 
} 

Désolé pour le C#. Mon VB est rouillé.

0

PanJanek est juste

aussi

Vous pouvez utiliser ajax et JSON avec jQuery il est très facile

mais il semble que vous aimez votre processus actuel, vous pourriez

retour Vue ("namedView") ou redirectToAction ("actionName")