Динамическое изменение формы действий с помощью jQuery - PullRequest
4 голосов
/ 07 октября 2011

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

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

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

$('#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>

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

6 голосов
/ 04 октября 2012

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

$('#send-email').click(function () {
   $('#email-form').attr('action', '/home/emailaccounting')
 )};
3 голосов
/ 07 октября 2011

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

$('#email-form').attr('action', '<%= Url.Action("emailaccounting", "home") %>');
0 голосов
/ 07 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...