2

我在我的 ASP.NET MVC 应用程序中使用jqgrid 。目前我有 mTYPE: 'POST' 像这样:

jQuery("#myGrid").jqGrid({
    mtype: 'POST',
    toppager: true,
    footerrow: haveFooter,
    userDataOnFooter: haveFooter,

但我正在阅读这篇文章,我看到了这段:

浏览器可以缓存用户硬盘上的图像、JavaScript、CSS 文件,如果调用是 HTTP GET,它还可以缓存 XML HTTP 调用。缓存基于 URL。如果它是同一个 URL,并且它被缓存在计算机上,那么响应会从缓存中加载,而不是在再次请求时从服务器加载。基本上,浏览器可以缓存任何 HTTP GET 调用并根据 URL 返回缓存的数据。如果您以 HTTP GET 的形式进行 XML HTTP 调用,并且服务器返回一些特殊的标头通知浏览器缓存响应,在以后的调用中,响应将立即从缓存中返回,从而节省网络往返的延迟和下载时间.

鉴于这种情况,我是否应该将我的 jqGrid mType 全部切换为使用“POST”中的“GET”作为 mType?(它说 XML(没有提到 JSON)。如果答案是肯定的,那么实际上我会想要为 jqGrid mType 使用 POST 的情况是什么,因为它似乎在没有这种缓存优势的情况下做同样的事情?

4

4 回答 4

3

您描述的问题可能在 Internet Explorer 中,但如果您使用默认选项,jqGrid 中将不存在该问题

如果您查看将使用的完整 URL,您将看到如下参数

nd=1339350870256

它与jQuery.ajax具有相同的cache: true含义。jqGrid 将当前时间添加到 URL 以使其唯一。

我个人喜欢在jqGrid中使用HTTP GET,但不喜欢nd参数的使用。我在旧答案中描述的原因。最好使用prmNames: {nd:null}jqGrid 的选项来删除ndURL 中参数的使用。而不是那个可以控制服务器端的缓存。例如设置

Cache-Control: private, max-age=0

是我的标准设置。要设置 HTTP 标头,您只需在 ASP.NET MVC 操作的代码中包含以下行

HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan (0));

您可以在答案中找到更多详细信息。

重要的是要理解,标头Cache-Control: private, max-age=0不会阻止数据的缓存,但是如果没有在服务器上重新验证,数据将永远不会被使用。使用其他 HTTP 标头选项ETag,您可以使重新验证真正起作用。主要思想是,ETag在更改服务器上的数据时总是会更改 的值。如果先前的数据已经在 Web 浏览器缓存中,Web 浏览器会自动发送If-None-MatchHTTP 请求中的一部分,其中的值ETag来自缓存的数据。因此,如果服务器看到数据没有更改,它可以使用具有304 Not Modified状态和HTTP 响应的空正文的 HTTP 响应来回答。它允许网络浏览器使用本地以前缓存的数据。

答案这个答案中,您将找到如何使用ETag方法的代码示例。

于 2012-06-10T19:00:29.430 回答
2

如果服务器发送的数据发生变化,那么您应该使用 POST 来避免每次请求时都获取缓存数据。

于 2012-06-10T15:32:10.880 回答
2

您不应将 GET 用于所有目的。GET 请求应该用于从服务器获取数据,而不是用于保存或删除操作。GET 请求有一些限制,因为您发送到服务器或附加为查询字符串的数据您不能使用 GET 请求发送非常大的数据。此外,您不应使用 GET 请求将敏感信息发送到服务器。您应该在所有其他情况下(如添加、编辑和删除)发出 POST 请求。

据我所知,jqgrid 在每个 GET 请求中都附加了一个唯一键,因此您不会从浏览器缓存中获得任何好处。

于 2012-06-10T16:52:40.690 回答
1

解决缓存行为的一种方法是在每次发出请求时使 GET 唯一。jQuery.ajax()通过将时间戳附加到请求的末尾来使用“缓存:false”来执行此操作。您可以使用类似的方法复制此行为:

uri = uri + '?_=' + (new Date()).getTime(); // uri represents the URI to the endpoint
于 2012-06-10T16:34:35.570 回答