如何在jqgrid中更新行后更新图像

时间:2011-10-02 21:36:50

标签: jqgrid

来自How to show image in jqgrid in edit mode的代码用于在jqgrid中显示图片。

如果行更新(编辑操作是调用控制器),则在服务器中更改行图像:图像URL保持不变,但在行保存后从服务器返回新图像。

jqgrid仍会显示旧图像:它不会从服务器请求新图像。按网格刷新按钮也不会请求新图像。按浏览器刷新按钮可检索新图像,但这非常不方便。

如何在jqgrid中更新行后显示新图像?

更新

我添加了outputgache属性,正如Oleg建议的那样。使用fiddler我验证了图像调用中的图像响应头

GET http://localhost:50076/erp/Grid/GetImage?_entity=Artpilt&size=54&id=734 HTTP/1.1
Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5
Referer: http://localhost:50076/erp/Grid?_entity=Artpilt
Accept-Language: et-EE
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: localhost:50076
If-Modified-Since: Mon, 03 Oct 2011 11:25:29 GMT
If-None-Match: "ArtPilt734"
Connection: Keep-Alive
Cookie: .MyAuth=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

是:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 03 Oct 2011 11:17:46 GMT
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 2.0
Cache-Control: public, max-age=0, s-maxage=0
Expires: Mon, 03 Oct 2011 11:17:46 GMT
Last-Modified: Mon, 03 Oct 2011 11:17:46 GMT
ETag: "ArtPilt734"
Content-Type: image/jpeg
Content-Length: 1444
Connection: Close

如果更改并保存编辑表单中的数据,则仍会保留旧图像。 fiddler表明没有从服务器检索到图像。

如果关闭编辑表单,则旧图像以网格显示。按jqgrid工具栏中的jqgrid刷新按钮会导致仍然显示旧图像。 Fiddler表明没有从服务器读取新的图像请求。只在浏览器中按F5检索新图像。

如果以编辑形式更改行数据,如何立即刷新图像?

UPDATE2 我认为Oleg意味着HttpCacheability.NoCache,而不是他在评论中写的HttpCacheability.Private。

我将MVC2控制器更改为

    [OutputCache(Duration = 0, VaryByParam = "")]
    public FileContentResult GetImage(string _entity, int id, int? size)
    {
        HttpContext.Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetMaxAge(new TimeSpan(0));

        ... retrieving image and fileextension form database skipped ...
        HttpContext.Response.Cache.SetETag("\"ArtPilt" + id.ToString() + "\"");
        return File(image, "image/" + imagetype );
    }

respose header是

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 03 Oct 2011 13:10:35 GMT
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 2.0
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: image/jpeg
Content-Length: 1457
Connection: Close

但问题仍然存在。 Fiddler显示未检索到当前行图像。

1 个答案:

答案 0 :(得分:0)

这听起来像是缓存问题。您应该在GetImage操作的HTTP标头中设置Cache-Control: max-age=0。您可以考虑另外设置ETag。有关详细信息,请参阅this答案。

在ASP.NET MVC程序中,您可以使用OutputCache属性

[OutputCache (Duration = 0, VaryByParam = "")]

Response.Cache.SetCacheability (HttpCacheability.Public);
Response.Cache.SetMaxAge (new TimeSpan (0));

或类似

Response.AddHeader ("Cache-Control", "max-age=0");

更新:我在一个演示项目中使用HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan (0));,该项目生成<img src=...>中使用的聊天。 HTTP标头将是

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 03 Oct 2011 11:59:40 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 2.0
Cache-Control: private, max-age=0
Content-Type: image/png
Content-Length: 55420
Connection: Close

每次都会调用生成并提供图像的相应动作。您发布的HTTP响应中的Expires标头看起来很可疑。我没有。