MVC4, jQuery Mobile и Javascript автоматическая отправка работают только один раз до обновления - PullRequest
0 голосов
/ 25 января 2012

У меня есть выпадающий список, который автоматически отправляет форму и выполняет поиск, который я использую по всему проекту через частичное представление, но он работает только при первом использовании, если я не обновляю страницу. Это MVC 4 с проектом jQuery Mobile.

Вот код, который я имею в своем частичном представлении,

<script type="text/javascript">
    $(function () {
        $("#CoastLineID").change(function () {
            var actionUrl = $('#TheForm').attr('action') + '/' + $('#CoastLineID').val();
             $('#TheForm').attr('action', actionUrl);
             $('#TheForm').submit();
         });
    });
</script>
<p>
    @using (Html.BeginForm("SearchCoast", "Home", FormMethod.Post, new { id = "TheForm" }))
    {
        @Html.DropDownList("CoastLineID", (SelectList)ViewBag.ArticleId, "Select a Coastline")
    }
</p>

Я думаю, мне нужно иметь возможность обновлять страницу или список каждый раз, когда страница / представление, которое использует частичное представление, каким-либо образом загружается. Это проблема jQuery ???

Есть идеи, могу ли я разместить URL для сайта, если мне позволено?

Обновление / Edit

Спасибо, ребята,

Я столкнулся с несколькими проблемами, связанными с jQuery Mobile и MVC, и в основном из-за того, что они оба по-разному обрабатывают строки URL, и все это произошло за 15 лет веб-разработки. Все документы jQuery Mobile имеют дело с классическими строками URL-адресов, например, about / us.html, что не соответствует MVC!

Это мой код контроллера для заполнения выпадающего списка,

var coastlines = db.CoastLines.Select(c => new { c.CoastLineID, c.CoastLineName });
ViewBag.CoastLineId = new SelectList(coastlines.AsEnumerable(), "CoastLineID", "CoastLineName", 0);

А это веб-сайт,

http://www.peninsulaguide.com.au/

Нажмите «Поиск по пляжу», а затем «Выбрать береговую линию» или «Выбрать город» будет работать, но после обновления ничего не произойдет.

Есть два раскрывающихся списка, но это не имеет значения, если я уберу один.

Приветствия

Mike

Ответы [ 2 ]

0 голосов
/ 25 января 2012

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

Если это такИтак, ваша проблема в том, что вы подключаете обработчик событий к одному выпадающему списку, а затем ожидаете, что этот обработчик событий будет обрабатывать события изменения из всех последующих выпадающих списков, которым присвоен тот же идентификатор.

Прочитайте .live() метод из документации jQuery , а затем измените свой код на следующий:

$(function () {
    $("#CoastLineID").live('change', function () {
        var actionUrl = $('#TheForm').attr('action') + '/' + $('#CoastLineID').val();
         $('#TheForm').attr('action', actionUrl);
         $('#TheForm').submit();
     });
});

Примечание: Если вы используете jQuery 1.7 или более позднюю версию, .live() устарела и должна быть заменена на .on().Для этого замените

$("#CoastLineID").live('change', function () { ... });

на

$(document).on('change', '#CoastLineID', function () { ... });

Подробности можно найти в документации для .live().Спасибо stian.net за указание на это.

0 голосов
/ 25 января 2012

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

Частичные представления - это просто устройство ASP.NET MVC, позволяющее вам обмениваться фрагментами HTML между страницами.Как только страница отображается в браузере, вы просто имеете дело с HTML и jQuery.

Наиболее вероятный виновник - ошибка в вашем jQuery.Трудно разобраться, не видя HTML, который визуализируется, но я предполагаю, что происходит одно из двух:

  1. Возможно, вы повторяете тот же поиск снова и снова из-за того, как вы 'выберите значение для отправки.
  2. Событие не срабатывает каждый раз, когда изменяется раскрывающееся меню.

Что касается устранения неполадок, попробуйте:

  • Установка точки останова в вашем контроллере, чтобы увидеть, вызывается ли она вообще и какие условия поиска возвращаются в запросе..
  • Добавление оператора console.log('something') внутри функции обратного вызова change, чтобы убедиться, что он вызывается при каждом вызове при изменении выбора.

Если вы разместите ссылку на свой сайт, я буду рад взглянуть на jQuery.

...