Existe-t-il un moyen simple de gérer plusieurs boutons d'envoi à partir du même formulaire? Par exemple:
<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>
Une idée de la façon de procéder dans ASP.NET Framework Beta? Tous les exemples que j'ai recherchés sur Google contiennent des boutons uniques.
c#
html
asp.net-mvc
http-post
form-submit
Spoike
la source
la source
Réponses:
Voici une solution basée sur des attributs pour la plupart du temps, propre au problème des boutons d'envoi multiples, basée principalement sur le message et les commentaires de Maarten Balliauw .
rasoir:
et contrôleur:
Mise à jour: les pages Razor cherchent à fournir la même fonctionnalité prête à l'emploi. Pour un nouveau développement, il peut être préférable.
la source
return View(viewmodel)
dans le cas où votre modèle contient des erreurs, il tentera de renvoyer une vue appeléeSend
ou selon le nom de votre argument.return View("Index", viewModel)
Donnez un nom à vos boutons d'envoi, puis inspectez la valeur soumise dans la méthode de votre contrôleur:
publication sur
ÉDITER:
Pour étendre cette approche pour travailler avec des sites localisés, isolez vos messages ailleurs (par exemple en compilant un fichier de ressources dans une classe de ressources fortement typée)
Modifiez ensuite le code pour qu'il fonctionne comme:
et votre contrôleur devrait ressembler à ceci:
la source
Vous pouvez vérifier le nom dans l'action comme cela a été mentionné, mais vous pouvez vous demander si c'est une bonne conception. C'est une bonne idée de considérer la responsabilité de l'action et de ne pas trop coupler cette conception aux aspects de l'interface utilisateur comme les noms des boutons. Pensez donc à utiliser 2 formulaires et 2 actions:
De plus, dans le cas de "Annuler", vous ne traitez généralement pas le formulaire et vous allez vers une nouvelle URL. Dans ce cas, vous n'avez pas du tout à soumettre le formulaire et vous avez juste besoin d'un lien:
la source
Eilon suggère que vous puissiez le faire comme ceci:
J'aime cette méthode car elle ne dépend pas de la propriété value des boutons de soumission qui est plus susceptible de changer que les noms attribués et ne nécessite pas d'activer javascript
Voir: http://forums.asp.net/p/1369617/2865166.aspx#2865166
la source
Je viens d'écrire un article à ce sujet: plusieurs boutons de soumission avec ASP.NET MVC :
Fondamentalement, au lieu d'utiliser
ActionMethodSelectorAttribute
, j'utiliseActionNameSelectorAttribute
, ce qui me permet de prétendre que le nom de l'action est celui que je veux qu'il soit. Heureusement,ActionNameSelectorAttribute
cela ne me fait pas seulement spécifier le nom de l'action, mais je peux choisir si l'action actuelle correspond à la demande.Il y a donc ma classe (btw je n'aime pas trop le nom):
Pour utiliser, définissez simplement un formulaire comme celui-ci:
et contrôleur avec deux méthodes
Comme vous le voyez, l'attribut ne vous oblige pas à spécifier quoi que ce soit. De plus, le nom des boutons est traduit directement en noms de méthode. De plus (je n'ai pas essayé), ces actions devraient également fonctionner comme des actions normales, vous pouvez donc les publier directement.
la source
submit
balise de la considération, ce qui est idéal car il s'agit d'un attribut d'interface utilisateur pur qui ne devrait pas avoir d'incidence sur le flux de contrôle. Au lieu de cela, l'name
attribut unique de chaquesubmit
balise se traduit directement en une méthode d'action discrète sur votre contrôleur.c'est court et suite:
et faire comme ça dans le code derrière
Bonne chance.
la source
Je suggère aux parties intéressées d' examiner la solution de Maarten Balliauw . Je pense que c'est très élégant.
Dans le cas où le lien disparaît, il utilise l'
MultiButton
attribut appliqué à une action du contrôleur pour indiquer à quel clic de bouton cette action doit se rapporter.la source
Vous devriez pouvoir nommer les boutons et leur donner une valeur; mappez ensuite ce nom comme argument à l'action. Vous pouvez également utiliser 2 liens d'action distincts ou 2 formulaires.
la source
Vous pourriez écrire:
Et puis dans la page, vérifiez si le nom == "Envoyer" ou le nom == "Annuler" ...
la source
Quelque chose que je n'aime pas dans ActionSelectName, c'est que IsValidName est appelé pour chaque méthode d'action dans le contrôleur; Je ne sais pas pourquoi cela fonctionne de cette façon. J'aime une solution où chaque bouton a un nom différent en fonction de ce qu'il fait, mais je n'aime pas le fait que vous devez avoir autant de paramètres dans la méthode d'action que de boutons dans le formulaire. J'ai créé une énumération pour tous les types de boutons:
Au lieu d'ActionSelectName, j'utilise un ActionFilter:
Le filtre trouvera le nom du bouton dans les données du formulaire et si le nom du bouton correspond à l'un des types de bouton définis dans l'énumération, il trouvera le paramètre ButtonType parmi les paramètres d'action:
puis dans les vues, je peux utiliser:
la source
Voici ce qui me convient le mieux:
la source
J'ai également rencontré ce «problème» mais j'ai trouvé une solution plutôt logique en ajoutant l'
name
attribut. Je ne me souvenais pas d'avoir eu ce problème dans d'autres langues.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
Cela signifie que les
value
attributs de code suivants peuvent être modifiés, localisés, internationalisés sans avoir besoin de vérifier le code supplémentaire des fichiers de ressources fortement typés ou des constantes.Du côté de la réception, il vous suffira de vérifier si l'un de vos types d'envoi connus n'est pas
null
la source
Si vous n'avez pas de restrictions sur l'utilisation de HTML 5, vous pouvez utiliser la
<button>
balise avecformaction
Attribute:Référence: http://www.w3schools.com/html5/att_button_formaction.asp
la source
Si votre navigateur prend en charge la formule d'attribut pour les boutons de saisie (IE 10+, vous n'êtes pas sûr des autres navigateurs), alors les éléments suivants devraient fonctionner:
la source
Il existe trois façons de résoudre le problème ci-dessus
Vous trouverez ci-dessous une vidéo qui résume les trois approches de manière démonstrative.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
Manière HTML: -
De la manière HTML, nous devons créer deux formulaires et placer le bouton «Soumettre» à l'intérieur de chacun des formulaires. Et l'action de chaque formulaire pointera vers des actions différentes / respectives. Vous pouvez voir le code ci-dessous que le premier formulaire affiche sur «Action1» et le second formulaire sera affiché sur «Action2» en fonction du bouton «Soumettre» sur lequel vous avez cliqué.
Voie Ajax: -
Si vous êtes un amoureux de l'Ajax, cette deuxième option vous exciterait davantage. De la manière Ajax, nous pouvons créer deux fonctions différentes "Fun1" et "Fun1", voir le code ci-dessous. Ces fonctions feront des appels Ajax en utilisant JQUERY ou tout autre framework. Chacune de ces fonctions est liée aux événements «OnClick» du bouton «Soumettre». Chacune de ces fonctions appelle les noms d'actions respectifs.
Utilisation de "ActionNameSelectorAttribute": -
C'est une excellente option et propre. «ActionNameSelectorAttribute» est une classe d'attributs simple où nous pouvons écrire une logique de prise de décision qui décidera quelle action peut être exécutée.
Donc, la première chose est en HTML, nous devons mettre le nom correct sur les boutons de soumission pour les identifier sur le serveur.
Vous pouvez voir que nous avons mis «Enregistrer» et «Supprimer» dans les noms des boutons. Vous pouvez également remarquer dans l'action que nous venons de mettre le nom du contrôleur «Client» et non un nom d'action particulier. Nous nous attendons à ce que le nom de l'action soit décidé par «ActionNameSelectorAttribute».
Ainsi, lorsque le bouton d'envoi est cliqué, il frappe d'abord l'attribut "ActionNameSelector", puis en fonction de la soumission qui est déclenchée, il appelle l'action appropriée.
La première étape consiste donc à créer une classe qui hérite de la classe «ActionNameSelectorAttribute». Dans cette classe, nous avons créé une simple propriété "Nom".
Nous devons également remplacer la fonction "IsValidName" qui renvoie true ou flase. Cette fonction est l'endroit où nous écrivons la logique si une action doit être exécutée ou non. Donc, si cette fonction renvoie true, l'action est exécutée, sinon elle ne l'est pas.
Le cœur principal de la fonction ci-dessus est dans le code ci-dessous. La collection «ValueProvider» contient toutes les données qui ont été publiées à partir du formulaire. Il recherche donc d'abord la valeur "Nom" et s'il est trouvé dans la requête HTTP, il renvoie vrai ou bien il renvoie faux.
Cette classe d'attributs peut ensuite être décorée sur l'action respective et la valeur «Nom» respective peut être fournie. Donc, si la soumission frappe cette action et si le nom correspond au nom du bouton de soumission HTML, il exécute ensuite l'action autrement ou non.
la source
David Findley écrit sur 3 options différentes que vous avez pour ce faire, sur son blog ASP.Net.
Lisez l'article plusieurs boutons dans le même formulaire pour voir ses solutions, ainsi que les avantages et les inconvénients de chacun. À mon humble avis, il fournit une solution très élégante qui utilise des attributs avec lesquels vous décorez votre action.
la source
C'est la technique que j'utiliserais et je ne la vois pas encore ici. Le lien (publié par Saajid Ismail) qui inspire cette solution est http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form .aspx ). Il adapte la réponse de Dylan Beattie pour effectuer la localisation sans aucun problème.
Dans la vue:
Dans le contrôleur:
la source
<input>
éléments. J'utilise<button>
, ce qui est nécessaire pour faire la localisation sans avoir d'attributs de valeur variable.Ce script permet de spécifier un attribut action-formulaire de données qui fonctionnera comme l'attribut de formaction HTML5 dans tous les navigateurs (de manière discrète):
Le formulaire contenant le bouton sera publié à l'URL spécifiée dans l'attribut action-formulaire de données:
Cela nécessite jQuery 1.7. Pour les versions précédentes, vous devez utiliser à la
live()
place deon()
.la source
Voici une méthode d'extension que j'ai écrite pour gérer plusieurs boutons d'image et / ou de texte.
Voici le code HTML d'un bouton d'image:
ou pour un bouton d'envoi de texte:
Voici la méthode d'extension avec laquelle vous appelez à partir du contrôleur
form.GetSubmitButtonName()
. Pour les boutons d'image, il recherche un paramètre de formulaire avec.x
(qui indique qu'un bouton d'image a été cliqué) et extrait le nom. Pour lesinput
boutons normaux, il recherche un nom commençant parSubmit_
et extrait la commande par la suite. Parce que je résume la logique de détermination de la `` commande '', vous pouvez basculer entre les boutons image + texte sur le client sans changer le code côté serveur.Remarque: pour les boutons de texte, vous devez préfixer le nom avec
Submit_
. Je préfère cette façon, car cela signifie que vous pouvez modifier la valeur du texte (affichage) sans avoir à changer le code. Contrairement auxSELECT
éléments, unINPUT
bouton n'a qu'un «valeur» et aucun attribut «texte» distinct. Mes boutons disent des choses différentes dans des contextes différents - mais correspondent à la même «commande». Je préfère de loin extraire le nom de cette façon que d'avoir à coder== "Add to cart"
.la source
Je n'ai pas assez de représentant pour commenter au bon endroit, mais j'ai passé toute la journée là-dessus, alors je veux partager.
Tout en essayant d'implémenter la solution "MultipleButtonAttribute"
ValueProvider.GetValue(keyValue)
reviendrait incorrectementnull
.Il s'est avéré que je faisais référence à System.Web.MVC version 3.0 alors qu'il aurait dû être 4.0 (les autres assemblys sont 4.0). Je ne sais pas pourquoi mon projet n'a pas été mis à jour correctement et je n'ai eu aucun autre problème évident.
Donc, si votre
ActionNameSelectorAttribute
ne fonctionne pas ... vérifiez cela.la source
Je suis assez en retard pour la fête, mais voilà ... Mon implémentation emprunte à @mkozicki mais nécessite moins de chaînes codées en dur pour se tromper. Framework 4.5+ requis . Essentiellement, le nom de la méthode du contrôleur doit être la clé du routage.
Marquage . Le nom du bouton doit être saisi avec
"action:[controllerMethodName]"
(notez l'utilisation de l' API nameof C # 6 , fournissant une référence spécifique au type du nom de la méthode de contrôleur que vous souhaitez invoquer.
Contrôleur :
Attribut Magic . Remarquez l'utilisation de la
CallerMemberName
bonté.la source
la source
J'ai essayé de faire une synthèse de toutes les solutions et j'ai créé un attribut [ButtenHandler] qui facilite la gestion de plusieurs boutons sur un formulaire.
Je l'ai décrit sur CodeProject Plusieurs boutons de formulaire paramétrés (localisables) dans ASP.NET MVC .
Pour gérer le cas simple de ce bouton:
Vous aurez quelque chose comme la méthode d'action suivante:
Remarquez comment le nom du bouton correspond au nom de la méthode d'action. L'article décrit également comment avoir des boutons avec des valeurs et des boutons avec des index.
la source
la source
c'est le meilleur moyen que j'ai trouvé:
http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html
Voici le code:
Profitez d'un futur bouton de soumission multiple sans odeur de code.
Merci
la source
Version modifiée de la
HttpParamActionAttribute
méthode mais avec un correctif de bogue pour ne pas provoquer d'erreur sur les publications de session expirées / non valides. Pour voir s'il s'agit d'un problème avec votre site actuel, ouvrez le formulaire dans une fenêtre et juste avant de cliquer surSave
ouPublish
, ouvrez une fenêtre en double et déconnectez-vous. Revenez maintenant à votre première fenêtre et essayez de soumettre votre formulaire en utilisant l'un ou l'autre bouton. Pour moi, j'ai eu une erreur, donc ce changement résout ce problème pour moi. J'omets un tas de trucs par souci de concision mais vous devriez avoir l'idée. Les éléments clés sont l'inclusion deActionName
sur l'attribut et s'assurer que le nom transmis est le nom de la vue qui montre le formulaireClasse d'attribut
Manette
Vue
la source
Mon approche JQuery utilisant une méthode d'extension:
Vous pouvez l'utiliser comme ceci:
Et ça rend comme ça:
la source
Pour chaque bouton d'envoi, ajoutez simplement:
la source
Sur la base de la réponse de mkozicki, je trouve une solution un peu différente. J'utilise toujours
ActionNameSelectorAttribute
Mais j'avais besoin de gérer deux boutons «Enregistrer» et «Sync». Ils font presque la même chose, donc je ne voulais pas avoir deux actions.attribut :
vue
manette
Je tiens également à souligner que si les actions font des choses différentes, je suivrais probablement mkozicki post.
la source
J'ai créé une ActionButton méthode de HtmlHelper . Il générera un bouton d'entrée normal avec un peu de javascript dans l' événement OnClick qui soumettra le formulaire au contrôleur / action spécifié.
Vous utilisez l'aide comme ça
cela générera le code HTML suivant
Voici le code de la méthode d'extension:
VB.Net
C # (le code C # est juste décompilé à partir de la DLL VB, donc il peut être embelli ... mais le temps est si court :-))
Ces méthodes ont différents paramètres, mais pour la facilité d'utilisation, vous pouvez créer une surcharge qui ne prend que les paramètres dont vous avez besoin.
la source