我已经为此苦苦思索了一段时间,并决定让 SO 社区对此进行破解......
我有一些操作可以响应来自客户端的 POST,这些操作执行简单的任务,JsonResult
如果成功,则返回从匿名类构建的具有简单布尔“成功”属性的操作,或者如果操作不成功,则返回PartialViewResult
错误ModelState
:
<HttpPost()> _
Public Function UpdateHeader(ByVal header As XmlReturnHeader) As ActionResult
If ModelState.IsValid Then
Dim updated As Integer = TaxRepository.XmlReturnHeader.Update(header)
If updated = 1 Then
Return Json(New With {.Success = True}, JsonRequestBehavior.AllowGet)
End If
End If
Return PartialView("Maintenance/Header", header)
End Function
在客户端,代码同样简单。我想看看结果是否有Success
属性,确保它是真的true
,然后从那里开始:
$.post('<%= Url.Action("UpdateHeader") %>', $(this).serialize(), function (data) {
if (data.Success && data.Success === true) {
$('#list').trigger('reloadGrid');
$('#edit').dialog('close');
} else { // result must be the HTML
$('#edit').html(data);
}
});
但是,我遇到了问题测试。我从回调函数收到的data
对象总是如下所示:
{ success: true }
^
s
in是小写的success
,而且因为JS是区分大小写的,所以有问题。
奇怪的是,如果我将 VB.NET 代码更改为
Return Json(New With {.Garbage = True}, JsonRequestBehavior.AllowGet),
我会收到
{ Garbage: true }
如果我把它改回New With { .Success = True }
,我会再次看到小写的s
。
我正在使用 IIS 和 IE9 进行测试。我觉得响应以某种方式被缓存了。在应用程序中的其他地方,我使用小写的“成功”作为匿名JsonResult
参数中的属性。也许 IIS 正在缓存来自先前 GET 或 POST 请求的响应?
[更新]
为了测试响应缓存理论,我将代码更改为:
Return Json(New With {.Success = True, .Random = DateTime.Now.Ticks},
JsonRequestBehavior.AllowGet)
这导致在客户端收到正确的响应。伟大的。但之前到底发生了什么?我认为 POST 可以免于缓存?还是只有请求而不是响应?
以后如何避免这种情况?
[更新]
另一个花絮:我确实通过 jQuery 全局禁用缓存我的请求,但我没有OutputCacheAttribute
在服务器端使用任何 s 或任何此类“无缓存”机制。我快速拍打<OutputCache(NoStore:=True, Duration:=0, VaryByParam:="*")>
整个控制器,.Random
从 JSON 中删除了属性,但仍然收到{ success: true }
.
我已经回收了应用程序池,删除了临时 .NET 文件,并清除了浏览器缓存,但同样的问题仍然存在。