【问题标题】:Ajax MVC Partial Returning Correct Response Yet Fires the Error HandlerAjax MVC 部分返回正确响应但触发错误处理程序
【发布时间】:2014-02-24 18:18:42
【问题描述】:

这把我彻底难住了。好奇怪。

我已经定义了这个 Ajax 函数:

$.ajax({
    type: 'GET',
    dataType: 'text/HTML',
    url: getLicenseeDetailsUrl,
    success: function (response) {
        $('#licenseeDetails').html('');
        $('#licenseeDetails').html(response);
    },
    error: function (xhr) {
        alert('Failed to get licensee details');
    }
});

我让它调用我的控制器,它的动作如下:

public ActionResult LoadLicenseeDetails(long licenseeId)
{
    var model = new LicenseeDetailsViewModel();

    var licencesee = _licensingRepository.LoadById(licenseeId);
    var licenses = _licensingRepository.LoadLicenses(licenseeId);

    model.Licencee = Mapper.Map<Licensee, LicenceeViewModel>(licencesee);
    model.Licences = Mapper.Map<IEnumerable<License>, IEnumerable<LicenceViewModel>>(licenses);

    return this.PartialView("_LicenseeDetails", model);
}

这一切似乎都按预期工作,没有任何错误,但它最终触发了 Ajax 错误函数,而不是成功函数。

查看xhr.responseText我可以看到来自动作控制器的正确响应信息!!

所有状态都为 200 OK。我到底做错了什么?

【问题讨论】:

    标签: javascript jquery ajax asp.net-mvc


    【解决方案1】:

    我到底做错了什么?

    这个:

    dataType: 'text/HTML'
    

    应该变成:

    dataType: 'html'
    

    引用dataType参数的documentation

    数据类型(默认:智能猜测(xml、json、脚本或html)

    类型:字符串

    您期望从 服务器。如果没有指定,jQuery 将尝试根据 响应的 MIME 类型(XML MIME 类型将产生 XML,在 1.4 JSON 将产生一个 JavaScript 对象,在 1.4 脚本将执行 脚本,其他任何内容都将作为字符串返回)。可用的 类型(以及作为第一个参数传递给您的成功的结果 回调)是:

    "xml":返回一个可以通过 jQuery 处理的 XML 文档。

    "html":以纯文本形式返回 HTML;包含的脚本标签是 在插入 DOM 时进行评估。

    “script”:将响应评估为 JavaScript 并将其作为纯文本返回。通过以下方式禁用缓存 将查询字符串参数“_=[TIMESTAMP]”附加到 URL,除非 缓存选项设置为真。 注意:这会将 POST 转换为 GET 用于远程域请求。

    “json”:将响应评估为 JSON 并返回一个 JavaScript 对象。 JSON数据被严格解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。从 jQuery 1.9 开始,空响应也会被拒绝;服务器应该 返回 null 或 {} 的响应。 (有关正确的 JSON 格式的更多信息,请参阅 json.org。)

    “jsonp”:使用 JSONP 加载到 JSON 块中。添加一个额外的“?callback =?”到 URL 的末尾以指定回调。通过将查询字符串参数“_=[TIMESTAMP]”附加到 URL 来禁用缓存,除非缓存选项设置为 true。

    “text”:纯文本字符串。

    多个以空格分隔的值:从 jQuery 1.5 开始,jQuery 可以将 dataType 从它在 Content-Type 标头中接收到的内容转换为您需要的内容。例如,如果您希望将文本响应视为 XML,请使用“text xml”作为 dataType。您还可以发出 JSONP 请求,将其作为文本接收,并由 jQuery 解释为 XML:“jsonp text xml”。类似地,诸如“jsonp xml”之类的速记字符串将首先尝试从 jsonp 转换为 xml,如果失败,则从 jsonp 转换为文本,然后从文本转换为 xml。

    或者更好的是,干脆去掉这个参数。 jQuery 足够智能,可以使用服务器设置的 Content-Type 响应 HTTP 标头来推断正确的类型并处理传递给 success 回调的参数。

    查看浏览器中 javascript 调试工具栏的 Console 选项卡。它将为您提供有关错误的更多信息。

    【讨论】:

    • 好吧,我今天要辞职了,我现在犯了太多基本错误。谢谢达林。
    • 谢谢@Darin,你拯救了我的一天。
    猜你喜欢
    • 2011-03-27
    • 2018-05-20
    • 1970-01-01
    • 2019-05-26
    • 2014-02-24
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多