【问题标题】:jQuery load's callback does not fire when paramaters are provided?提供参数时不会触发 jQuery 加载回调?
【发布时间】:2013-06-27 19:34:20
【问题描述】:

当我将参数发布到服务器时,jQuery的加载的回调函数没有执行。

这会导致服务器错误,但回调函数会执行:

chassisLookupDialog.load('../Workflow/FindChassisDialog/', function (response, status, xhr) {

    console.log("Response", response, status, xhr);

    chassisLookupDialog.open();
});

这行得通,参数到达服务器并且没有抛出错误,但回调函数永远不会执行:

chassisLookupDialog.load('../Workflow/FindChassisDialog/', {
        dataCenterID: dataCenterID,
        bladeTemplateID: bladeTemplateID,
        selectedChassisID: selectedChassisID,
        selectedSlotNumber: selectedSlotNumber
    }, function (response, status, xhr) {

    console.log("Response", response, status, xhr);

    chassisLookupDialog.open();
});

这是我的控制器:

public ActionResult FindChassisDialog(int dataCenterID, int bladeTemplateID, int selectedChassisID, int selectedSlotNumber)
{
    FindChassisDialogModel findChassisDialogModel = new FindChassisDialogModel();

    return View("FindChassisDialog", findChassisDialogModel);
}

如果我检查服务器的响应,我会发现所有 HTML 格式正确。不知道为什么我的回调不会执行...有什么想法吗?

这会以视图的 html 作为错误数据调用错误事件:

$.ajax({
    type: 'POST',
    dataType: 'json',
    url: '../Workflow/FindChassisDialog/',
    data: {
        dataCenterID: dataCenterID,
        bladeTemplateID: bladeTemplateID,
        selectedChassisID: selectedChassisID,
        selectedSlotNumber: selectedSlotNumber
    },
    success: function (data) {
        console.log("Success:", data);
    },
    error: function (error) {
        console.error("Error:", error);
    }
});

【问题讨论】:

  • 提供参数时,load 方法以post 发送请求,当参数不存在时,loadget 方法发送请求。可能是您的服务器无法处理 post 方法。
  • 是的,同意,只是不太确定如何/为什么。我看到响应成功返回,没有错误或请求失败。我只是看到它返回视图,然后从未点击回调。我还有其他工作示例,其中我发送了 1 个参数,并且效果很好。我还没有发现差异。
  • 尝试使用$.ajaxcompletesuccess/error事件
  • 将我的 ajax 请求编辑到帖子中。使用 responseText 作为视图的 HTML 调用“错误”。
  • 尝试在请求中添加dataType : html。另外,检查errorText。 error 回调有 3 个参数 ( jqXHR jqXHR, String textStatus, String errorThrown )

标签: jquery asp.net-mvc-3 callback load


【解决方案1】:

在您的 $.ajax 请求中删除以下行:

dataType: 'json',

我的意思是,你告诉 jQuery 这个 AJAX 请求将返回 JSON,但你正在从控制器操作返回 HTML (return View(...))。因此,当 jQuery 尝试将其解析为 JSON 时,它显然会崩溃,并且您的 success 回调将永远不会被执行。

所以:

$.ajax({
    type: 'POST',
    url: '../Workflow/FindChassisDialog/',
    data: {
        dataCenterID: dataCenterID,
        bladeTemplateID: bladeTemplateID,
        selectedChassisID: selectedChassisID,
        selectedSlotNumber: selectedSlotNumber
    },
    success: function (data) {
        console.log("Success:", data);
    },
    error: function (error) {
        console.error("Error:", error);
    }
});

顺便说一句,硬编码这样的网址是完全错误的:

url: '../Workflow/FindChassisDialog/',

在处理 url 时,您应该始终在 ASP.NET MVC 应用程序中使用 url 助手。

还有一件事:为什么要从通过 AJAX 调用的控制器操作返回整个视图(而不是部分视图)?

【讨论】:

  • 我之前使用过 $.load,不过……当然,我应该能够在传递多个参数的同时加载视图。我理解为什么 $.ajax 由于 dataType 而不能工作,并且我知道如何手动加载 HTML 响应,但是如果我需要传递超过 1 个参数,我很震惊 MVC 没有为我这样做。
  • 而且我也知道这些 URL 很糟糕,但我在技术债务下工作(整个项目是在 MVC1 期间创建的,并且一直在缓慢升级)。我目前无权将它们全部标准化。
  • 好的,那么当您从 $.ajax 调用中删除 dataType: 'json' 设置时会发生什么?此外,您在技术债务下工作的事实绝对不是不开始减少这项债务的借口。就个人而言,如果我看到这样的硬编码网址,我会立即改进它,然后再考虑继续为这个项目做出贡献。该项目是在 ASP.NET MVC 1 下创建的,这绝对不是借口。即使在该版本下,也可以使用 Url.* 助手。
  • 如果我从 AJAX 请求中删除 dataType json,那么我可以在响应中接收 HTML。然后,我必须调用 jQuery.html(response);将 HTML 加载到元素中。这不像 $.load'ing 那样直观,这是我产生困惑的元素。是的,我也理解这一点,但争论是为了保持一致。如果我没有时间去更改我们当前如何处理 URL 的每个实例,那么我不应该只更改其中的 /some/ 。我宁愿有错误但一致而不是半一致半错误。
  • 您可以使用 javascript 调试工具(例如 FireBug)检查工作 $.ajax 调用和非工作 element.load 调用之间发送的请求负载和动词的差异。如果您向 element.load 调用发送参数,通常不应该有任何参数,因为这会发送 AJAX 请求。当您使用 element.load 时,您在 FireBug 中看到了什么?服务器返回什么状态码?
猜你喜欢
  • 1970-01-01
  • 2014-04-03
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 2011-11-23
  • 2015-03-29
相关资源
最近更新 更多