【问题标题】:.NET MVC JSON Post Call response does not hit complete or success.NET MVC JSON 调用后响应未完成或成功
【发布时间】:2014-01-27 05:39:24
【问题描述】:

我是 .NET MVC 的新手,所以请多多包涵。

我写了一个函数,当 textarea 控件上有模糊操作时触发:

     function extractURLInfo(url) {
        $.ajax({
            url: "/Popup/Url",
            type: "POST",
            data: { url: url },
            complete: function (data) {
                alert(data);
            },
            success: function (data) {
                alert(data);
            },
            async: true
        })
        .done(function (r) {
            $("#url-extracts").html(r);
        });
    }

    jQuery(document).ready(function ($) {
        $("#input-post-url").blur(function () {
            extractURLInfo(this.value);
        });
    });

这很好用,并且会命中控制器:

[HttpPost]
        public ActionResult Url(string url)
        {
            UrlCrawler crawler = new UrlCrawler();
            if (crawler.IsValidUrl(url))
            {
                MasterModel model = new MasterModel();
                model.NewPostModel = new NewPostModel();

                return PartialView("~/Views/Shared/Partials/_ModalURLPartial.cshtml", model);
            }
            else
            {
                return Json(new { valid = false, message = "This URL is not valid." }, JsonRequestBehavior.AllowGet);
            }
        }

如果 URL 有效,我会得到预期的结果;它会将部分视图返回给 .done() 函数,我只是在代码中显示它。但是,如果 URL 无效,我希望它完成、成功或完成(我一直在玩,看看它会命中哪个,但没有运气!)并对返回的数据做一些事情。我在某个时候触发了完成或成功,但数据是“未定义的”。有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

  • stackoverflow.com/questions/18667447/…。使用此链接,您可以传递 json 和部分内容,以便检查错误消息或呈现部分内容。
  • 如果没有完成或成功,您的控制台可能有错误。

标签: javascript jquery .net json asp.net-mvc-4


【解决方案1】:

在这两种情况下,您的控制器操作都会返回 200 状态代码,因此它会触发您的 success 回调:

$.ajax({
    url: "/Popup/Url",
    type: "POST",
    data: { url: url },
    success: function (data) {
        if (data.message) {
            // Your controller action return a JSON result with an error message
            // => display that message to the user
            alert(data.message);
        } else {
            // Your controller action returned a text/html partial view
            // => inject this partial to the desired portion of your DOM
            $('#url-extracts').html(data);
        }
    }
});

当然,一个更好且语义正确的方法是在发生错误时设置正确的状态码,而不是仅仅返回大约 200 个状态码:

[HttpPost]
public ActionResult Url(string url)
{
    UrlCrawler crawler = new UrlCrawler();
    if (crawler.IsValidUrl(url))
    {
        MasterModel model = new MasterModel();
        model.NewPostModel = new NewPostModel();

        return PartialView("~/Views/Shared/Partials/_ModalURLPartial.cshtml", model);
    }
    else
    {
        Response.StatusCode = 400;
        Response.TrySkipIisCustomErrors = true;
        return Json(new { valid = false, message = "This URL is not valid." }, JsonRequestBehavior.AllowGet);
    }
}

然后在您的 AJAX 调用中,您将适当地处理这些情况:

$.ajax({
    url: "/Popup/Url",
    type: "POST",
    data: { url: url },
    success: function (data) {
        $('#url-extracts').html(data);
    },
    error: function(xhr) {
        if (xhr.status == 400) {
            // The server returned Bad Request status code
            // => we could parse the JSON result
            var data = JSON.parse(xhr.responseText);

            // and display the error message to the user
            alert(data.message);
        }
    }
});

另外不要忘记,您有一些返回错误消息的标准方法,您可以订阅 jQuery 中的全局 .ajaxError() 处理程序,而不是将此代码放在所有 AJAX 请求中。

【讨论】:

  • 谢谢!我喜欢这个答案,它非常有帮助!我认为在我的情况下,我只会将错误放在 textarea 下,而不是让全局 div 来查看错误,但我可能会稍后在其他地方使用该建议。我还需要清除 chrome 上的缓存,因为我在尝试调试时没有收到警报。我尝试了不同的浏览器,它运行良好。保存并关闭标签后,我将在 chrome 上重试。谢谢!
猜你喜欢
  • 2022-08-16
  • 2012-05-02
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多