Ответы jQuery AJAX в ASP.NET MVC

Даже не уверен, что это правильный способ назвать вопрос. Я знаю, что делаю свои вызовы AJAX неправильно... вот что я делаю прямо сейчас (кстати, я использую бэкэнд ASP.NET MVC):

Я использую jQuery.ajax для отправки некоторых данных в действие, которое загружает представление, которое я фиксирую в ответе. По сути, это предоставление некоторых данных для действия и получение некоторого HTML-кода.

Допустим, я хотел создать проверяемый вызов Ajax. Как вернуть сообщения проверки при ошибке? Например, форма входа Ajax. Если пользователь не может быть проверен, я хотел бы сказать ему об этом... вместо того, чтобы просто ничего не делать.

Извините за наивный вопрос, я просто не знаю, как правильно сказать, чтобы найти решения в Google.

Заранее спасибо!


person Chaddeus    schedule 12.08.2009    source источник


Ответы (4)


Прежде всего, если вы хотите, чтобы вызов AJAX возвращал данные, которые вы планируете использовать в своих сценариях (и под использованием я имею в виду что-то более сложное, чем отображение этих данных в div), вам, вероятно, следует возвращать данные JSON вместо HTML с вашего сервера. . JSON на самом деле является объектом JS, поэтому его можно использовать в JS в момент его получения.

Итак, если вы вернете данные, т.е.

{id: 1, status: 'ok'}

Вы можете использовать что-то подобное, чтобы использовать эти данные.

$.ajax({
    url: "your/script/url",
    type: "POST",
    data: {login : 'foo', pass: 'bar'}, // whatever the data is
    dataType: "json",
    success: function(data){
        if (data.status === 'ok') {
            console.log('success');
        } else {
            console.log('error');
        }
    }

});

person RaYell    schedule 12.08.2009
comment
Почему бы вам не использовать $.getJSON()? - person kay.herzam; 12.08.2009
comment
Спасибо, я уже собирал ответ JSON. Добавить поле статуса будет легко. Не знаю, почему я не подумал об этом раньше. - person Chaddeus; 12.08.2009

Вам нужно будет вернуть несколько фрагментов информации для вашего ответа. К счастью, вы можете легко сделать это с помощью JSON, и jQuery автоматически обработает это за вас, если вы укажете, что тип ответа — json. Объект, который вы получаете в своей функции обратного вызова ajax, будет содержать все необходимые вам данные в виде различных свойств.

Я бы предложил взять за привычку возвращать код состояния «успех» или «неудача» при каждом вызове ajax и вместе с ним набор ошибок. Дополнительную информацию см. в этом замечательном сообщении в блоге. на что я имею в виду.

Причина этого в том, что вызов ajax всегда будет в основном «успешным», если только сервер фактически не может обработать запрос и не вернет код состояния http с ошибкой. Если результатом запроса является что-то вроде ошибки проверки, но сервер все равно возвращает какой-то текстовый ответ, то вызов ajax все равно считается успешным, даже несмотря на то, что операция приложения не удалась.

Итак, если в вашем методе действия вместо возврата ваших html-данных в результате действия вы вернули такой объект:

public class AjaxResponse
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
        /// This creates an AjaxResponse that by default indicates SUCCESS.
        /// </summary>
        public AjaxResponse()
        {
            Success = true;
            Data = new List<object>();
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
        /// This creates an AjaxResponse that indicates FAILURE.
        /// </summary>
        /// <param name="exception">The exception.</param>
        public AjaxResponse(Exception exception)
            : this()
        {
            Success = false;
            Errors = new [] { exception.Message };
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
        /// This creates an AjaxResponse that indicates SUCCESS.
        /// </summary>
        /// <param name="data">The data.</param>
        public AjaxResponse(object data)
            : this()
        {
            Data = data;
        }

        /// <summary>
        /// Gets or sets a value indicating whether this <see cref="AjaxResponse"/> is success.
        /// </summary>
        /// <value><c>true</c> if success; otherwise, <c>false</c>.</value>
        public bool Success
        {
            get; set;
        }

        /// <summary>
        /// Gets or sets the data.
        /// </summary>
        /// <value>The data.</value>
        public object Data
        {
            get; set;
        }

        /// <summary>
        /// Gets or sets the errors.
        /// </summary>
        /// <value>The errors.</value>
        public string[] Errors
        {
            get; set;
        }
    }

Это преобразуется в объект javascript со свойствами «.Success», «.Data» и «.Errors».

Итак, если ваш код проверки заполнил массив Errors всеми ошибками проверки, вашей функции обратного вызова ajax было бы легко

  1. определить, что предполагаемая цель вызова не удалась, поскольку свойство SUCCESS было установлено на «сбой».

  2. Получите все соответствующие строки ошибок.

Вы можете легко сделать это с помощью такого шаблона в своих методах действий:

    try
    {
        instance.Validate();
        return Json(new AjaxResponse(myHtmlData));
    }
    catch(Exception ex)
    {
        var response = new AjaxResponse(ex);

        // Get your validation errors here, put them into
        // your ajax response's Errors property.

        return Json(response);
    }
person womp    schedule 12.08.2009
comment
Мне нравится концепция, но это слишком много для того, что мне нужно для этого проекта. Обязательно возьму на заметку. Спасибо! - person Chaddeus; 12.08.2009
comment
Просто чтобы уточнить, функция .NET должна возвращать JsonResult. - person pbz; 15.09.2009

Я описал в блоге ту же ситуацию. Возможно, это поможет и вам в вашей ситуации. В основном речь идет о наличии собственного класса исключения и атрибута действия исключения, который будет возвращать ошибку. Таким образом, вы можете использовать параметры success и error вызова $.ajax. Что, на мой взгляд, является правильным способом сделать это.

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

person Robert Koritnik    schedule 19.11.2010

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

  1. Пользователь нажимает на какую-либо кнопку/ссылку, что вызывает действие
  2. Асинхронный пост отправляется обратно на сервер, передавая идентификатор пользователя (здесь вы должны помнить о безопасности)
  3. На сервере выполняется необходимая проверка, и ответ отправляется обратно (в XML, Json, непосредственно сообщение, закодированное как HTML)
  4. Вернувшись на сторону клиента, вы получаете свой ответ в своем коде JavaScript и размещаете его соответствующим образом на странице.

Надеюсь, это поможет.

person Juri    schedule 12.08.2009