Jquery post возвращает html в результате и не загружает его на страницу

#javascript #ajax #asp.net-mvc #post

#javascript #ajax #asp.net-mvc #Публикация

Вопрос:

Думаю, я здесь немного запутался. У меня есть моя домашняя страница, и я нажимаю кнопку поиска, которая вызывает jquery post (пробовал с .get тоже) на мой контроллер. Контроллер получает некоторую информацию, а затем, в этот момент, я хочу отобразить новую страницу / представление под названием «События». НО страница не загружается в браузере, HTML для просмотра отправляется обратно в результатах jquery post. К вашему СВЕДЕНИЮ — я использую форму только для получения результатов проверки, я не отправляю ее с помощью нажатия какой-либо кнопки. Вопрос — Должен ли я отправить форму, чтобы это тоже работало так, как я ожидаю?

Вот мой код контроллера.

 [HttpPost]
    [AllowAnonymous]
    public ActionResult JumbotronSearch(SearchCriteria searchCriteria)
    {
        try
        {
            var viewModel = new EventsViewModel();
            DbGeography location = Geocoding.GetDbGeography(searchCriteria.latitude.ToString(), searchCriteria.longitude.ToString());
            viewModel.Events = _Repository.AllWithinDistance(location,
                    searchCriteria.date.Add(searchCriteria.date == DateTime.Now.Date
                        ? DateTime.Now.TimeOfDay
                        : new TimeSpan(12, 0, 0, 0)), 1);

            viewModel.SearchCriteria = searchCriteria;

            return View("Events",viewModel);
        }
        catch (Exception ex)
        {
            // log exception in file or db or both
            return Json(new { error = "true", message = "Oh No! Something happened trying to submit your search. Please contact YogaBandy Help Desk." });
        }
    }
  

Вот форма просмотра / home / index

 <form id="jumbotronForm" class="form-group form-inline" style="position: relative">
  <input id="jumbotronSearch" type="text" class="form-control input-lg" placeholder="Location" required maxlength="50" minlength="4" />
  <label id="location-error" for="jumbotronSearch" style="display: none;">The location was not found.</label>
  <input id="jumbotronDate" type="text" class="form-control input-lg" value="@DateTime.Now.Date.ToShortDateString()" readonly/>
  <input id="jumbotronSubmit" type="button" class="btn btn-default btn-lg" value="Search" />
</form>  

Вот javascript для моего контроллера, чтобы получить результаты и загрузить новое представление

    $("#jumbotronSubmit").off('click').on('click', function() {
     model.date = $('#jumbotronDate').val();
     var form = $('#jumbotronForm');
     form.validate();

     if (form.valid()) {
       if (model.formatted_address == location.value) {
         submitSearchCriteria(model);
       } else {
         var navbarGeocoder = new google.maps.Geocoder();
         navbarGeocoder.geocode({
           'address': location.value
         }, function(results, status) {
           if (status == google.maps.GeocoderStatus.OK) {
             model.formattedAddress = results[0].formatted_address;
             model.latitude = results[0].geometry.location.lat();
             model.longitude = results[0].geometry.location.lng();
             model.mapType = results[0].types[0];
             submitSearchCriteria(model);
           } else {

             $('#location-error').show();

             setTimeout(function() {
               $('#location-error').fadeOut('fast');
             }, 2000);
             yb.base.displayNotification("Couldn't find location. Check your spelling", 'danger');
           }
         });
       }

       function submitSearchCriteria(model) {
         $.post(scope.enumControllers.jumbotronSearch, model, function(result) {
           if (result.error == true) {
             yb.base.displayNotification(result.message, 'danger');
           }
         }).fail(function(jqXHR, textStatus) {
           yb.base.displayNotification("Oh no! Something went wrong sending your request. Please contact the help desk.", 'danger');
         });
       }
     }
   });  

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

1. Если вы хотите отобразить новую страницу, то не используйте ajax (весь смысл ajax в том, чтобы оставаться на той же странице)

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

3. ДА. И в методе POST, который вы отправляете, вы должны использовать return RedirectToAction(...); для перенаправления на другой метод, который отображает ваше другое представление.

4. Мне не нужно перенаправлять на другое действие. Я просто хочу загрузить представление для действия, которое я отправляю в свой контроллер, поэтому, я думаю, я прерываю отправку вызовом .on (submit), чтобы получить больше данных и выполнить некоторую логику, затем, если все хорошо, я выполняю ручной вызов типа $ (‘form’).submit()?

5. Если вы не хотите перенаправлять на другую страницу, тогда вам нужно обновить DOM при успешном обратном вызове — например, $.post(...., function(result) { $(someElement).html(result); } — но ваш метод должен возвращать PartialView() не View()

Ответ №1:

Просто используйте следующее, чтобы получить данные.

  var info;
 $("#div").load("URL",function(response, status, xhr){info = response;});
  

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

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

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

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