2012-10-18 19 views
3

我一直在抓我的头对这个有一段时间了,并已决定让SO社区采取裂缝它... ...不一致的属性名外壳中产生JsonResult

我有回应一些操作从客户端是做简单的任务,并返回一个匿名类来构建一个简单的布尔“成功”属性JsonResult如果成功,或返回PartialViewResultModelState错误,如果行动是不成功的文章:

<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 } 
^

successs是小写,因为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秒或在服务器端使用任何这样的“无缓存”机制。我快速地对整个控制器打了一下<OutputCache(NoStore:=True, Duration:=0, VaryByParam:="*")>,从JSON中删除了.Random属性,但仍收到{ success: true }

我已经尽力回收应用程序池,删除临时.NET文件并清除浏览器缓存,并且同样的问题仍然存在。

回答

0

如果您还没有看到它,你可能想看看在输出缓存下面的文章在ASP.net MVC:http://juristr.com/blog/2012/10/output-caching-in-aspnet-mvc/

根据这篇文章,默认响应头包括:

Cache-Control:private 

这意味着IE 可以将缓存在私有缓存中。本文提供了三种禁用缓存这些请求的选项:在服务器上全局禁用它(我不推荐出于客户端性能原因),编写自定义全局操作筛选器(结果相同),或者添加一个属性到叫你的控制器动作的OutputCache:

<OutputCache(Duration:=0)> 

虽然jQuery的设置应该执行类似的功能,它可以不争取相同的结果。试试这个,看看它是否有效。