2010-03-11 7 views
5

Ich habe ein Formular mit zwei Schaltflächen senden in meiner asp.net mvc (C#) -Anwendung. Wenn ich auf eine Senden-Schaltfläche in Google Chrome klicke, ist der Wert der Übermittlungsschaltfläche standardmäßig der Wert der ersten Übermittlungsschaltfläche. Hiermit zwei Senden von Schaltflächen in Form eines einzigen Formulars

ist die html:

<input type="submit" value="Send" name="SendEmail" /> 
<input type="submit" value="Save As Draft" name="SendEmail" /> 
<input type="button" value="Cancel" /> 

Wenn ich Sie auf die Schaltfläche Save As Draft, in der Wirkung der Steuerung, es wird auf „Senden“ als Wert für SendEmail. Hier

ist die Aktion:

public ActionResult SendEmail(string SendEmail, FormCollection form) 
{ 
     if(SendEmail == "Send") 
     { 
      //Send Email 
     } 
     else 
     { 
      //Save as draft 
     } 
     return RedirectToAction("SendEmailSuccess"); 
} 

Wenn ich den Wert von Formcollection erhalten, zeigt es auf „Senden“. d. h. form["SendEmail"] gibt Send

Was kann das Problem oder die Arbeit um mich tun müssen, um den tatsächlichen Wert der angeklickt senden Schaltfläche zu erhalten?

+0

Ihr Code sieht gut aus, sollte diese Technik funktioniert. Könnte versuchen, den HTTP-POST zu überprüfen, um zu sehen, was genau an den Server zurückgesendet wird. – DavGarcia

+0

Es passiert nur in Google Chrome, aber in IE und Firefox funktioniert es gut. – Prasad

+0

Was ist mit Chrome ?! – Ted

Antwort

-2

Arbeit um: Verwenden Sie Javascript, um die Form submiting statt einreichen Tasten

5

dieses Versuchen Sie stattdessen:

<input type="submit" value="Send" name="send" /> 
<input type="submit" value="Save As Draft" name="save" /> 

und:

public ActionResult SendEmail(string send, FormCollection form) 
{ 
    if (!string.IsNullOrEmpty(send)) 
    { 
     // the Send button has been clicked 
    } 
    else 
    { 
     // the Save As Draft button has been clicked 
    } 
} 
+0

Es gibt den Wert "Senden" zurück, wenn auf eine der Schaltflächen in Google Chrome geklickt wird. In IE wird jedoch null zurückgegeben, wenn Sie auf "Als Entwurf speichern" klicken. Das Problem ist nur bei Verwendung von Google Chrome – Prasad

+0

Liest du meine Post sorgfältig? Haben Sie die Namen der Schaltflächen und den Namen des an die Aktion übergebenen Parameters bemerkt? –

+0

Ja, ich habe meinen Code entsprechend Ihrer Antwort geändert, aber das Problem ist das gleiche. Ich weiß nicht, was mit Google Chrome seltsam ist. – Prasad

1

Versteckte HTML-Elemente werden mit Ihrem Formular gesendet, so dass Sie ein verstecktes Element hinzufügen und es bei Klick auf die Schaltfläche vor dem Senden ändern können. Geben Sie true zurück, um mit der Formularübermittlung fortzufahren.

@Html.Hidden("sendemail", true) 
<input type="submit" value="Send" 
     onclick="$('#sendemail').val(true); return true" /> 
<input type="submit" value="Save As Draft" 
     onclick="$('#sendemail').val(false); return true;" /> 

Jetzt können Sie einfach den Wert aus Ihrer Formularsammlung ziehen.

public ActionResult SendEmail(FormCollection form) 
{ 
    if(Boolean.Parse(form["sendemail"])) 
    { 
     //Send Email 
    } 
    else 
    { 
     //Save as draft 
    } 
    return RedirectToAction("SendEmailSuccess"); 
} 

Anstatt die Formcollection direkt obwohl verwenden, wäre die beste Praxis ein Ansichtsmodell zu erstellen, die die angegebene Eigenschaft enthält.

Ansicht Modell

public class FooViewModel 
{ 
    public bool SendEmail { get; set; } 
    // other stuff 
} 

HTML

// MVC sets a hidden input element's id attribute to the property name, 
// so it's easily selectable with javascript 
@Html.HiddenFor(m => m.SendEmail) 

// a boolean HTML input can be modified by setting its value to 
// 'true' or 'false' 
<input type="submit" value="Send" 
     onclick="$('#SendEmail').val(true); return true" /> 
<input type="submit" value="Save As Draft" 
     onclick="$('#SendEmail').val(false); return true;" /> 

Controller Aktion

public ActionResult SendEmail(FooViewModel model) 
{ 
    if(model.SendEmail) 
    { 
     //Send Email 
    } 
    else 
    { 
     //Save as draft 
    } 
    return RedirectToAction("SendEmailSuccess"); 
}