如何从ajax调用中找回我想要的内容?

时间:2014-03-07 00:28:43

标签: jquery ajax asp.net-mvc-4

我正在构建一个MVC 4项目,其中我显示了一个项目表及其几个状态里程碑。每个里程碑都由一个绿色,黄色或红色的单元格表示。我使用html助手构建这些单元格的内容,使用一些相当复杂的逻辑在彩色背景上显示文本内容。我想允许用户单击任何单元格并弹出一个jQuery对话框,使用局部视图显示与该状态项相关的详细信息。每个单元都有相同的css类,我用它来绑定click事件,然后向服务器发送ajax调用,传递单元的id。正在按控制器方法的预期接收呼叫但是ajax呼叫失败。 使用一个数据模型构建发送视图来填充单元格,当然我需要向局部视图发送不同的数据模型,我不知道不匹配是否是失败的原因,我不认为所以。我试图使用简单的数据进行开发只是为了使它工作,所以我尝试只发送一个值或一个键/值对作为Json并且每种方式都失败。

这是js:

$('.statusCell').click(function () {
        var statusId = this.id;
        alert("clicked this status: " + statusId);

        var request = $.ajax({
            url: "/Report/GetStatusData/",
            data: {
                id: statusId
            }

        });

        request.success(function (data) {
            alert("returned ajax data: " + data);
        });
        request.fail(function (jqXHR, textStatus) {
            alert("Request failed: " + textStatus);
        });
});

失败功能正如您在失败时所期望的那样显示。 这是控制器代码,我在其中尝试了几次返回尝试:

public ActionResult GetStatusData(int id)
{
    return Json(new { prop = id });
    //return PartialView("_displayStatus", id);
}

问题是我真的不知道我需要在详细程度上做什么。我理解一般概念,但不了解实际情况。我过去做过ajax调用,但是在其中使用带有Ajax的ActionLinks,部分视图作为成功目标。这是不同的,它让我望而却步。 我需要返回到视图以便将新数据传递到局部视图并加载它?我可以不发回我需要的模型吗?我错过了什么形式? 我可能会提到我还没有编写部分代码,因为我想先让它工作。但是我不明白为什么没有视图接收新数据应该重要,因为我没有将它们映射到一起。 我感谢任何人提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

此时请求超出范围。将成功放在click事件中。我把它放在ajax调用本身。根据数据添加

success: function(data){
    alert("returned ajax data: " + data);
}

答案 1 :(得分:0)

要使JSON从控制器返回到ajax调用,必须满足以下几个条件:

  1. 您必须让控制器发送格式正确的JSON。
  2. Ajax调用必须知道它期待JSON(或者能够智能地猜测它是JSON)。
  3. 我不确切知道您的ASP环境是如何工作的,但是您是否100%确定您正在创建合法的JSON并从控制器发送它?您可以在Chrome或Firefox调试器的网络选项卡中准确验证发送的内容,它将显示通过网络传输的确切数据。这通常会增加发生或可能出错的清晰度。

    对于第2项,您需要控制器将请求类型设置为JSON,以便ajax调用看到它是JSON mime类型,或者您需要在ajax调用中指定dataType。如果可以的话,最好在服务器端修复它,这样它就可以自动使用jQuery ajax调用。

    您可以强制执行JSON数据类型:

    $('.statusCell').click(function () {
            var statusId = this.id;
            alert("clicked this status: " + statusId);
    
            var request = $.ajax({
                url: "/Report/GetStatusData/",
                data: {
                    id: statusId
                },
                dataType: "json"
            });
    
            request.success(function (data) {
                alert("returned ajax data: " + data);
            });
            request.fail(function (jqXHR, textStatus) {
                alert("Request failed: " + textStatus);
            });
    });