生成的JsonResult中的属性名称大小不一致

时间:2012-10-18 18:45:33

标签: jquery vb.net json caching asp.net-mvc-2

我一直在讨论这个问题已经有一段时间了,并且已经决定让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文件和清除浏览器缓存,同样的问题仍然存在。

1 个答案:

答案 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设置应该执行类似的功能,但它可能无法获得相同的结果。试试这个,看它是否有效。