использование двух кнопок отправки внутри одной формы

У меня есть форма с двумя кнопками отправки в моем приложении asp.net mvc (C#). Когда я нажимаю любую кнопку отправки в Google Chrome, по умолчанию значением кнопки отправки является значение первой кнопки отправки.

Вот html:

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

Когда я нажимаю кнопку Save As Draft, в действии контроллера он получает «Отправить» в качестве значения для SendEmail.

Вот действие:

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

Когда я получаю значение из FormCollection, оно показывает «Отправить». то есть form["SendEmail"] дает Send

В чем может быть проблема или обходной путь, который мне нужно сделать, чтобы получить фактическое значение нажатой кнопки отправки?


person Prasad    schedule 11.03.2010    source источник
comment
Ваш код выглядит нормально, этот метод должен работать. Можно попробовать проверить HTTP POST, чтобы узнать, что именно отправляется обратно на сервер.   -  person DavGarcia    schedule 11.03.2010
comment
Это происходит только в Google Chrome, но в IE и Firefox работает хорошо.   -  person Prasad    schedule 11.03.2010
comment
Что не так с Хромом?!   -  person Ted    schedule 04.12.2013


Ответы (4)


Показать эту страницу.

ASP.NET MVC — Несколько кнопок в одной форме — Блог Дэвида Финдли

Создайте наследуемый класс ActionMethodSelectorAttribute.

person takepara    schedule 11.03.2010
comment
эта ссылка также показывает, как обрабатывать несколько кнопок без использования атрибута ActionMethodSelectorAttribute (это то, что мне нужно!) Спасибо! - person Andrew; 15.05.2010

Попробуйте это вместо этого:

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

и:

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
    }
}
person Darin Dimitrov    schedule 11.03.2010
comment
Он возвращает значение «Отправить» при нажатии любой из кнопок в Google Chrome, но в IE возвращает значение null при нажатии «Сохранить как черновик». Проблема только при использовании гугл хром - person Prasad; 11.03.2010
comment
Вы внимательно читаете мой пост? Вы обратили внимание на названия кнопок и название параметра, передаваемого в действие? - person Darin Dimitrov; 11.03.2010
comment
да, я изменил свой код в соответствии с вашим ответом, но проблема та же. Я не знаю, что странного с Google Chrome. - person Prasad; 11.03.2010

Скрытые элементы HTML будут отправлены вместе с вашей формой, поэтому вы можете добавить скрытый элемент и изменить его нажатием кнопки перед отправкой. Верните true, чтобы продолжить отправку формы.

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

Теперь вы можете просто вытащить значение из своей коллекции форм.

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

Однако вместо непосредственного использования FormCollection лучше всего создать модель представления, содержащую указанное свойство.

Просмотреть модель

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

Действие контроллера

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

обходной путь: используйте javascript для отправки формы вместо кнопок отправки

person Jack    schedule 11.03.2010