2010-03-11 9 views
5

Mam formularz z dwoma przyciskami Wyślij w mojej aplikacji asp.net mvc (C#). Po kliknięciu dowolnego przycisku przesyłania w numerze Google Chrome domyślnie wartość przycisku Wyślij to wartość pierwszego przycisku przesyłania.za pomocą dwóch przycisków przesyłania wewnątrz pojedynczego formularza

Oto html:

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

Kiedy klikam przycisk Save As Draft w działaniu sterownika, to dostaje „Wyślij” jako wartość SendEmail.

Oto działanie:

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

kiedy otrzymuję wartość z FormCollection, to pokazuje "Wyślij". tj form["SendEmail"] daje Send

Co może być problemem lub obejść muszę zrobić, aby uzyskać rzeczywistą wartość klikniętego przycisku Prześlij?

+0

Twój kod wygląda dobrze, że technika powinna działać. Może spróbować sprawdzić HTTP POST, aby zobaczyć, co dokładnie jest wysyłane z powrotem do serwera. – DavGarcia

+0

Zdarza się tylko w Google Chrome, ale w IE i Firefox działa dobrze. – Prasad

+0

Co to jest w Chrome ?! – Ted

Odpowiedz

-2

obejść: używać JavaScript dla wysłaniem formularza zamiast przedstawić przycisków

5

Spróbuj to zamiast:

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

i:

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

Zwraca wartość "Wyślij" po kliknięciu jednego z przycisków w Google Chrome, ale w IE zwraca wartość zerową po kliknięciu przycisku "Zapisz jako wersję próbną". Problem jest tylko przy korzystaniu z google chrome – Prasad

+0

Czy czytasz mój wpis uważnie? Czy zauważyłeś nazwy przycisków i nazwę parametru przekazanego do akcji? –

+0

Tak, zmieniłem kod zgodnie z twoją odpowiedzią, ale problem jest taki sam. Nie wiem co jest dziwne w Google Chrome. – Prasad

1

Ukryte elementy HTML zostaną przesłane wraz z formularzem, aby można było dodać ukryty element i zmodyfikować go na przycisku kliknij przed przesłaniem. Zwróć true, aby kontynuować składanie formularza.

@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;" /> 

Teraz możesz po prostu wyciągnąć wartość z kolekcji formularzy.

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

Zamiast używać FormCollection bezpośrednio choć, najlepsze praktyki byłoby stworzyć model widok zawierający określoną właściwość.

Widok Model

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 Akcja

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