我一直在讨论这个问题已经有一段时间了,并且已经决定让SO社区对此采取行动......
我有一些操作可以响应客户端执行简单任务的POST,并返回一个由匿名类构建的JsonResult
,如果成功,则返回一个简单的布尔“Success”属性,或者返回{{ 1}}如果操作失败,则会出现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
是小写的,因为JS区分大小写,所以我遇到了问题。
奇怪的是,如果我将VB.NET代码更改为
success
我会收到
Return Json(New With {.Garbage = True}, JsonRequestBehavior.AllowGet),
如果我将其更改回{ Garbage: true }
,我会再次看到小写New With { .Success = True }
。
我正在使用IIS和IE9进行测试。我觉得响应是以某种方式缓存的。在应用程序中还有其他地方我使用小写“成功”作为匿名s
参数中的属性。也许IIS正在缓存先前GET或POST请求的响应?
[更新]
为了测试响应缓存理论,我将代码更改为:
JsonResult
这导致在客户端收到正确的响应。大。但是之前到底发生了什么?我认为POST可免于缓存?或者只是请求而不是响应?
将来如何避免这种情况?
[更新]
另一个小问题:我通过jQuery全局禁用缓存我的请求,但我没有在服务器端使用任何Return Json(New With {.Success = True, .Random = DateTime.Now.Ticks},
JsonRequestBehavior.AllowGet)
或任何此类“无缓存”机制。我在整个控制器上快速打了OutputCacheAttribute
,从JSON中删除了<OutputCache(NoStore:=True, Duration:=0, VaryByParam:="*")>
属性,但仍然收到了.Random
。
我已经开始回收应用程序池,删除临时.NET文件和清除浏览器缓存,同样的问题仍然存在。
答案 0 :(得分:0)
如果您还没有看到它,您可能需要查看以下有关ASP.net MVC中输出缓存的文章:http://juristr.com/blog/2012/10/output-caching-in-aspnet-mvc/
根据该文章,默认响应标头包括:
Cache-Control:private
这意味着IE 可以缓存私有缓存中的响应。本文提供了三种禁用这些请求缓存的选项:在服务器上全局禁用它(我不建议出于客户端性能原因),编写自定义全局操作过滤器(具有相同结果)或添加属性为名为OutputCache的控制器操作:
<OutputCache(Duration:=0)>
虽然jQuery设置应该执行类似的功能,但它可能无法获得相同的结果。试试这个,看它是否有效。