используя jquery post, верните что, если не успех? - PullRequest
0 голосов
/ 26 июня 2011

я использую jquery.post. Моя проблема в том, что я не знаю, что вернуть, если это не удалось с моего контроллера? Допустим, если состояние модели недействительно, проверьте мой контроллер ниже.

public ActionResult SendNewsLetter(FooterViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            try
            {
                var email = _newsletterService.GetAll().Where(x => x.Email == viewModel.Email).SingleOrDefault();

                if (email == null)
                {
                    _newsletterService.Save(new NewsletterEmail() { AddedDate = DateTime.Now, Email = viewModel.Email, IdGuid = GenerateGuid.Generate() });
                    _email.Send(viewModel.Email, "Title", "body", AppSetting.Value(Key.Email()));
                }
                else
                {
                    _newsletterService.Delete(email.Id);
                }

                if (Request.IsAjaxRequest())
                {
                    return Content(FeedBackMessages.NewsletterSuccess());
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            catch (Exception)
            {
                //What to put here?
            }

        }

        if (Request.IsAjaxRequest())
        {
            //What to put here?
            return Content("");
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }

мой JQuery

$('#formNewsletter').submit(function () {
                $.post(this.action, $(this).serialize(), function (data) { success(data); });
                return false;
            });
function success(message) {
            //TODO the real success handle
            alert(message);
        };

Ответы [ 2 ]

1 голос
/ 26 июня 2011

добавьте это в ваш метод post (), чтобы сделать что-то с ошибкой

$.post(this.action, $(this).serialize(), function (data) { success(data); });
                return false;
            }).error(function() { alert("error"); });

Редактировать:

Чтобы вернуть пустую строку, я бы вернул JsonResult.Это подкласс ActionResult и имеет свойство Data.Вы можете добавить в него переменные json, которые могут быть интерпретированы javascript в переменные js.Если вы не знакомы с JSON, перейдите сюда http://www.json.org/

Очень просто, должно выглядеть примерно так:

        catch (Exception)
        {
            return new JsonResult() { Data = "'Message' : ''" };
            //will return a json result with the data set to have a variable `Message` that is an empty string
        }

Со стороны Js это выглядит так:

      $('#formNewsletter').submit(function () {
            $.post(this.action, $(this).serialize(), function (data) { success(data); });
            return false;
        });

    function success(data) {
        //TODO the real success handle
        alert(data.Message); //this should do it, I could be wrong, if so put a break point here and inspect the data object in firebug or dev tools to see where the `Message` json variable is stored.
    };
0 голосов
/ 26 июня 2011

Я не знаком с ASP.NET, но предполагаю, что Content(FeedBackMessages.NewsletterSuccess()) преобразует объекты в соответствующий HTTP-ответ, в данном конкретном случае, возможно, локализованный String в ответ с Content-Type: text/plain.

Мое предложение заключалось бы в том, чтобы обернуть сообщение об успешном завершении в объект результата, который содержит не только сообщение об успешном завершении или об ошибке, но и соответствующее состояние, например

class Result {
    boolean success
    String message
}

Предполагая, что Content() преобразует объекты в JSON, вы можете вернуть Result объект с помощью success=false и оценить это в своем обработчике успеха jQuery. (Обновление: см. Ответ Мэтью Кокса, чтобы узнать, как создать объект результата JSON.)

$.post(this.action,
    $(this).serialize(),
    function (data) {
        // Data transport went fine, now check the application logic result:
        if (data.success) {
            success(data.message);
        } else {
            failure(data.message);
        }
    }
);

Может быть, есть более простой, нативный подход ASP.NET, но этот в целом работает хорошо, и JSON хорошо поддерживается на стороне клиента JS.

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