ASP.NET MVC частичное представление части с jQuery ajax

У меня есть действие controllerа, которое отображает частичный вид:

public ActionResult Details(int id) { DetailsViewModel model = ModelBuilder.GetDetailsViewModel(id, _repository); return PartialView("Details", model); } 

и я загружаю возвращаемое содержимое в динамический элемент следующим образом:

 $container = appendContainer(); // adds a div to the dom with the correct id $container.load("MyController/Details", function(response, status, xhr) { if (status != "success") { $(container).html('an error has occured'); } }); 

поэтому это создает div, а затем загружает возвращаемое содержимое в этот div.

Я хочу немного изменить это, чтобы контейнер div был создан только в том случае, если вызов controllerа завершился успешно.

Так:

  1. jQuery вызывает действие controllerа
  2. controller возвращает PartialView или null, если Id не найден
  3. Если возвращается PartialView, контейнер создается и загружается возвращенным контентом.
  4. Если controller не находит идентификатор, контент не создается и отображается предупреждение.

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

Вся load – это возврат HTML с сервера, так почему бы просто не добавить временный div, а затем получить HTML-код от успеха?

 var $dummy = $("
"); $dummy.load("MyController/Details", function(response, status, xhr) { var $container = appendContainer(); if (status != "success") { $container.html('an error has occured'); } else { $container.html($dummy.html()); } $dummy.remove(); });

ОБНОВИТЬ:

Если вы ожидаете исключения, вы должны это обработать. Если вы в основном допускаете ошибку, чтобы получить status != "success" тогда это серьезный запах кода. Вы должны поймать ошибку и вернуть другой PartialView.

 public ActionResult Details(int id) { try { DetailsViewModel model = ModelBuilder.GetDetailsViewModel(id, _repository); return PartialView("Details", model); } catch (SomeException ex) { return PartialView("Error", ex.Message); } } 

Тогда вы гарантированно получите действительный ответ HTML, и если вы этого не сделаете, то начнется ваша основная ошибка an error occured .

в вашем случае я бы использовал $ .ajax вместо .load (), дал вам больше контроля над streamом + чувствовал себя более чистым

 $.ajax({ url: "MyController/Details", type: "GET", success: function (response, status, xhr) { var jqContainer = appendContainer(); jqContainer.html(response); }, error:function(XMLHttpRequest, textStatus, errorThrown) { //show the error somewhere - but this is a bad solution } }); 

относительно состояния ошибки – я также ненавижу полагаться на исключения – уродливые и неэффективные, у вас есть несколько способов справиться с этим:

  1. возвращать только JSON из ваших представлений и связывать возвращенные данные с помощью своего рода шаблонов решения, таким образом вы можете вернуть объект ошибки с определенным сообщением об ошибке и обрабатывать все ошибки одинаково (подумайте, что это лучшее решение).
  2. верните код статуса успеха 204 – нет ответа, который возвращает значение null из вашего действия, – затем проверьте код состояния и выведете сообщение об ошибке.
  3. вернуть код статуса успеха 278 (не настоящий код состояния, но рассчитывает на успех и позволяет отправлять данные) – здесь вы отправляете объект json с сообщением об ошибке, которое может обрабатывать и отображать сообщение об ошибке (см. это решение 278 здесь, в SO когда-то).
  4. возвратите другое представление для ошибки – но тогда вы должны вставить его в контейнер или фиктивный контейнер, чтобы проверить, есть ли ошибка, если вы хотите сделать больше действий.

в моем коде я использую $ (document) .ajaxSend (..), чтобы глобально проверить все ответы Ajax на код 278 и показать сообщения об ошибках, если они есть, или вызвать исходную функцию успеха на крючке.

Чтобы вернуть ошибку из действия, я использую следующий результат:

  public class AjaxErrorWithDetailsResult : JsonResult { public object ErrorResult { get; set; } public AjaxErrorWithDetailsResult(object errorResult) { this.ErrorResult = errorResult; } public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); } this.Data = ErrorResult; context.HttpContext.Response.StatusCode = 278; base.ExecuteResult(context); } } 

где ErrorResult может быть анонимным объектом или объектом, реализующим интерфейс с свойством ErrorMessage, чтобы вы знали, что искать в JS

Interesting Posts

В чем разница между .bashrc, .bash_profile и .environment?

Android – доступ к файлу из активов \ PDF-дисплей

Извлечение уникальных чисел из строки в R

API для настройки статических IP-адресов в приложении для Android

Нарушение синтаксиса строки электронной почты Outlook 2010 для встроенных ответов

Получить имя таблицы из модели в Hibernate

Одновременное использование обеих передних и задних камер

Как изменить звездные изображения в RatingBar?

Проблема с автозагрузкой ноутбука?

Запланированная задача WinXP: открыть веб-страницу в браузере

Получить URL-адрес загрузки из файла, загруженного с помощью облачных функций для Firebase

Есть ли разница между одиночными и двойными кавычками в Java?

Зарегистрировать IAuthenticationManager с помощью простого инжектора

Как я могу проверить фактический размер, используемый в каталоге NTFS со многими hardlinks?

Значения индекса из матрицы с использованием строк, индексов col

Давайте будем гением компьютера.