2009-10-12 6 views
2

J'ai une vue dans asp.net MVC qui a deux boutons d'envoi. Je voudrais savoir quel bouton a été pressé. Les boutons fonctionnent très bien donc il n'y a pas de problème là-bas, j'ai juste besoin de faire des choses légèrement différentes selon le bouton. J'ai vérifié la collection Request.Form [] et cela ne contient rien.Détermination du bouton de soumission utilisé pour POST un formulaire dans asp.net MVC

Voici mon code vue ....

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Data.TempPerson>" %> 
<div class="phonePerson"> 
    <% using (Ajax.BeginForm("Create", new AjaxOptions 
     { 
      UpdateTargetId = "divList", 
      HttpMethod = "Post", 
      OnSuccess = "RedoLayout" 
     })) 
     { %> 
    <label for="Name"> 
     Name:</label> 
    <%= Html.TextBox("Name")%> 
    <input type="submit" name="Button" id="Save" value="Save" class="btnSave" /> 
    <div id="phoneList" class="phoneList"> 
     <table> 
      <% foreach (var item in Model.Phones) 
       { %> 
       ... Stuff omitted for space .... 
      <% } %> 
      <tr> 
       <td colspan="2"> 
        <input type="submit" id="Add" name="Button" value="Add another phone" class="btn_AddPhone" /> 
       </td> 
      </tr> 
     </table> 
     <% } %> 
    </div> 
</div> 
+0

btw, vous fermez également votre formulaire dans votre div. Déplacez la fermeture d'une étiquette. sinon vous obtenez

qui est mauvais html. –

Répondre

3

Je serais tenté d'ajouter que je l'aurais utilisé deux formes, chacune avec un seul bouton Soumettre pour faire en sorte que chaque formulaire n'avait qu'une seule responsabilité. Cela faciliterait la séparation des préoccupations et rendrait l'application plus testable.

+0

Très bon point. L'utilisation d'une forme globale a tendance à se substituer aux habitudes d'ASP.net. –

+0

C'est drôle, vous devriez le dire. :) Je migre ceci d'une solution qui avait deux formes. Le problème est que les données des formulaires sont jointes. La meilleure solution serait d'essayer de supprimer le second soumettre. :) – Craig

+0

-1 Toutefois, cela ne vous permet pas de réutiliser les contrôles sur la même page. Si vous avez une entrée utilisée par les deux soumissions, vous devrez dupliquer cette entrée. – Evildonald

3

Deux façons:

Tout d'abord, un paramètre de chaîne à votre "Créer" fonction nommée "Button"

public ActionResult Create(string Button)//and other fields 
{ 
if (Button == value1) then 
    //do stuff 
else if (Button == value2) then 
    //do stuff 
end if 
//return 
} 

Où value1 = "Ajouter un autre téléphone"

Si vous le transmettez avec la collection de formulaires, alors ce sera

si (FormCollection [ « bouton »] == valeur1) ....

+0

+1 C'est la bonne façon de le faire. – Evildonald

1

Peut-être que c'est trop facile, mais pourquoi ne pas simplement utiliser l'attribut PostBackUrl dans chaque contrôle de soumission, et ajouter un paramètre à sa chaîne de requête?

Par exemple,

<asp:Button ID="Button1" runat="server" Text="Button One" 
PostBackUrl="Text.aspx?b=1" UseSubmitBehavior="true" .../> 

<asp:Button ID="Button2" runat="server" Text="Button One" 
PostBackUrl="Text.aspx?b=2" UseSubmitBehavior="true" .../> 

Le « b » paramètre querystring peut être capturé sur le côté serveur:

string mode = HttpContext.Current.Request.QueryString["b"].ToString(); 

... et vous faire des choses différentes basées sur la valeur de , dans ce cas, la variable de mode.

Questions connexes