【问题标题】:Inconsistent property name casing in generated JsonResult生成的 JsonResult 中的属性名称大小写不一致
【发布时间】:2012-10-09 07:43:24
【问题描述】:

我已经为此苦苦思索了一段时间,并决定让 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 }
  ^

success中的s是小写的,因为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 全局禁用缓存我的请求,但我没有在服务器端使用任何 OutputCacheAttributes 或任何此类“无缓存”机制。我很快在整个控制器上打了&lt;OutputCache(NoStore:=True, Duration:=0, VaryByParam:="*")&gt;,从JSON 中删除了.Random 属性,但仍然收到{ success: true }

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

【问题讨论】:

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


    【解决方案1】:

    如果你还没有看过,不妨看看下面这篇关于 ASP.net MVC 中的输出缓存的文章:http://juristr.com/blog/2012/10/output-caching-in-aspnet-mvc/

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

    Cache-Control:private
    

    这意味着 IE 可以在私有缓存中缓存响应。本文提供了三个选项来禁用这些请求的缓存:在服务器上全局禁用它(出于客户端性能原因我不建议这样做),编写自定义全局操作过滤器(具有相同的结果),或添加一个属性到您的控制器操作称为 OutputCache:

    <OutputCache(Duration:=0)>
    

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

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2011-11-30
      • 2015-04-28
      相关资源
      最近更新 更多