使用jquery帖子,如果没有成功则返回什么?

时间:2011-06-26 19:07:34

标签: jquery asp.net-mvc-2

即时通讯使用jquery.post。我的问题是,如果我的控制器没有成功,我不知道该返回什么?让我们说如果modelstate无效,请检查下面的控制器。

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 个答案:

答案 0 :(得分:1)

将此附加到您的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.
    };

答案 1 :(得分:0)

我不熟悉ASP.NET,但我认为Content(FeedBackMessages.NewsletterSuccess())会将对象转换为相应的HTTP响应,在这种特殊情况下可能是StringContent-Type: text/plain的响应

我的建议是将成功消息包装到一个结果对象中,该对象不仅包含成功或错误消息,还包含相应的状态,如

class Result {
    boolean success
    String message
}

假设Content()将对象转换为JSON,您可以返回带有Result的{​​{1}}对象,并在您的jQuery成功处理程序中对此进行评估。 (更新:请参阅Matthew Cox的回答,了解如何创建JSON结果对象。)

success=false

也许有一种更简单的原生ASP.NET方法,但是这种方法通常运行良好,并且JS客户端也很好地支持JSON。