Ajax MVC部分返回正确的响应然后触发错误处理程序

时间:2014-01-31 21:35:31

标签: javascript jquery ajax asp.net-mvc

这让我完全难过。很奇怪。

我定义了这个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。我到底在做什么呢?

1 个答案:

答案 0 :(得分:9)

  

我到底做错了什么?

这样:

dataType: 'text/HTML'

应该成为:

dataType: 'html'

引用dataType参数的documentation

  

dataType (默认:智能猜测(xml,json,脚本或html)

     

类型:字符串

     

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

     

“xml”:返回可以通过jQuery处理的XML文档。

     

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

     

“script”:将响应评估为JavaScript并将其作为纯文本返回。禁用缓存   将查询字符串参数“_ = [TIMESTAMP]”附加到URL,除非   cache选项设置为true。 注意:这会将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,请对dataType使用“text xml”。您还可以发出JSONP请求,将其作为文本接收,并由jQuery解释为XML:“jsonp text xml”。类似地,诸如“jsonp xml”之类的速记字符串将首先尝试从jsonp转换为xml,如果失败,则从jsonp转换为text,然后从text转换为xml。

甚至更好,只需摆脱这个参数。 jQuery足够智能,可以使用服务器设置的Content-Type响应HTTP标头,以推断出正确的类型并处理传递给success回调的参数。

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