Динамическое изменение действия формы с помощью jQuery

#jquery #asp.net-mvc #asp.net-mvc-3

#jquery #asp.net-mvc #asp.net-mvc-3

Вопрос:

У меня на моей странице есть форма, которая выглядит так:

 <form action="/home/email" enctype="multipart/form-data" id="email-form" method="post">
// form elements
</form>
  

В зависимости от страницы я хотел бы динамически изменять атрибуты формы с помощью jQuery; в частности, атрибут action.

 $('#send-email').click(function () {
   $('#email-form').attr('action', '@Url.Action("emailaccounting", "home")')
 )};
  

Приведенный выше jQuery успешно отображает:

 <form action="/home/emailaccounting" enctype="multipart/form-data" id="email-form" method="post">
// form elements
</form>
  

Таким образом, я могу изменять атрибуты формы при нажатии на ссылку, которая открывает всплывающую форму для отправки электронного письма. Однако, когда я отправляю форму, действие, которое попадает, является исходным — «электронная почта», а не «учет электронной почты».

Я еще немного поиграл и в обработчике отправки клика для формы электронной почты добавил следующее:

   $('.send-email').click(function (e) {
    // The original form action post will be hit without this...
    e.preventDefault();
    $('#email-form').submit();
  };
  

В приведенном выше фрагменте вызывается правильное действие — «учет электронной почты». Почему? Я не знаю … я надеюсь, что кто-нибудь сможет это объяснить. Но я еще не вышел из положения — у меня есть элемент ввода для загрузки файла. Теперь, когда я пытаюсь загрузить файл в ту же форму, которая работала ранее, я нажимаю отправить, и он переходит к действию «электронная почта». Если я не пытаюсь выполнить загрузку файла, он попадает в действие «учет электронной почты».

  1. Почему функция e.preventDefault(), за которой следует отправка формы, выполняет правильное действие?
  2. Почему загрузка файла направляет его к исходному действию формы, а не к тому, которое было изменено jQuery?

Спасибо!

Комментарии:

1. Можете ли вы предоставить jsfiddle. чистая иллюстрация вашей проблемы? Из вашего описания все должно работать нормально, что означает, что вы что-то пропустили в коде, который вы показали здесь.

2. Можете ли вы опубликовать HTML send-email -код кнопки? Я предполагаю, что это вызвано чем-то, сгенерированным .net.

3. Дарин — я думаю, что это может быть сложно продемонстрировать там только потому, что проблема проявляется на стороне сервера, когда я устанавливаю точки останова для двух разных действий контроллера.

4. @Бивис, нет, это легко показать. На самом деле не важно, что делает действие сервера или возвращает ли оно 404. Важно проиллюстрировать сценарий, который выбирает неправильное действие, несмотря на то, что вы его меняете. Конечно, это можно было наблюдать с FireBug.

5. @Darin Хорошо, позвольте мне попробовать настроить jsfiddle…

Ответ №1:

Я попробовал, как показано ниже, и это сработало для меня

 $('#send-email').click(function () {
   $('#email-form').attr('action', '/home/emailaccounting')
 )};
  

Ответ №2:

Попробуйте что-то вроде этого:

 $('#email-form').attr('action', '<%= Url.Action("emailaccounting", "home") %>');
  

Комментарии:

1. Джеймс — Действие изменяется правильно (я проверил исходный html). Проблема в том, что правильное действие в моем контроллере не выполняется.

Ответ №3:

Вы просто хотите, чтобы действие было текущей страницей, что бы это ни было? Если это так, вы можете просто использовать action="" .

Вы не указали, с каким браузером и версией вы тестируете, или пробовали ли вы другие. На самом деле это может быть ошибка / функция безопасности / особенность браузера. Если это так, вы можете обойти это, просто отправив форму через AJAX. Функционально это ничем не отличается, вы даже можете перенаправить страницу после успешного ответа, чтобы она вела себя так же. Однако с помощью AJAX вы можете явно управлять URL-адресом публикации, не прибегая к изменению действия.

Комментарии:

1. Крис — действие отлично изменено. Я вижу изменение исходного кода. Проблема заключается в странном поведении при отправке формы. Он попадает в исходное действие, а не в то, которое было изменено jQuery.

2. Я понимаю, но я просто проверял, чтобы убедиться, что вы не пытаетесь изменить действие только для того, чтобы сделать его текущим URL страницы, потому что это был бы способ сделать это надежно, тем самым полностью устраняя проблему.

3. Крис — это так. Я продолжу и попробую ваше предложение, хотя действие кажется просто прекрасным…

4. Да, jQuery изменяет его так, как должно, но никогда не исключайте, что браузер может делать совершенно глупые вещи, которые он не должен ;). Если действие просто пусто, это сводит на нет необходимость изменять его с помощью JavaScript и устраняет ваши проблемы без головной боли, связанной с выяснением, почему браузер глупый.