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

如何在jqgrid中更新行后更新图像,jqgrid,Jqgrid,来自的代码用于在jqgrid中显示图像 若行被更新(编辑操作被调用),则行图像在服务器中被更改:图像url保持不变,但行保存后从服务器返回新图像 jqgrid仍然显示旧映像:它不会从服务器请求新映像。按网格刷新按钮也不会请求新图像。按浏览器刷新按钮检索新图像,但这非常不方便 在jqgrid中更新行后如何显示新图像 更新 我按照Oleg的建议添加了outputcache属性。我使用fiddler验证了图像调用中的图像响应头 GET http://localhost:50076/erp/Grid/G

来自的代码用于在jqgrid中显示图像

若行被更新(编辑操作被调用),则行图像在服务器中被更改:图像url保持不变,但行保存后从服务器返回新图像

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

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

更新

我按照Oleg的建议添加了outputcache属性。我使用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
是:

若编辑表单中的数据被更改并保存,旧图像仍然保留。fiddler显示tmage未从服务器检索

若编辑表单关闭,旧图像将显示在网格中。按下jqgrid工具栏中的jqgrid刷新按钮,仍会显示旧图像。 Fiddler显示未从服务器读取新映像请求。仅在浏览器中按F5键可检索新图像

如果编辑表单中的行数据发生更改,如何立即刷新图像

更新2 我认为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 );
    }
响应头是

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显示当前行图像未被检索。

听起来像是缓存问题。您应该在
GetImage
操作的HTTP头中设置。另外可以考虑设置<代码> ETag < /代码>。有关更多信息,请参阅答案

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

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

或者类似的

Response.AddHeader ("Cache-Control", "max-age=0");
更新:我使用了
HttpContext.Current.Response.Cache.SetMaxAge(新的时间跨度(0))在一个演示项目中,该项目生成了
中使用的聊天记录。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
头对我来说是可疑的。我没有。

我想如果这是浏览器缓存问题,HTTP请求仍然会被调用,只是一旦浏览器读取响应头并意识到它有图像的缓存副本,传输就会结束。@Oleg:非常感谢。我按照您的建议添加了缓存指令,但问题仍然存在。我更新了问题。@Walter Stabosz:我不认为你是对的。所有这些都取决于站点中使用的默认HTTP头。例如,如果您从上一个答案打开并检查关于的HTTP流量,您将看到,如果在IE中打开编辑表单,则不会发送任何HTTP请求。@Andrus:我认为您应该删除
Expires
HTTP头或将其设置为过去的日期。您可以使用
SetExpires
。而且可能是行
Response.Cache.SetCacheability(HttpCacheability.Public)以设置
缓存控制:private
并禁用代理上的图像缓存(如果存在)。@Andrus:我没有你的具体情况,但在我的答案更新部分中描述的非常接近的情况下,我没有您描述的问题。如果您使用Firebug或其他web调试器,并在保存行后调查网格的HTML,您是否在IMG元素中看到新图像的URL?@Walter:URL始终相同。如更新的答案所示,这是包含行id的动态url。GetImage从同一url返回不同的图像。GetImage检查行数据并根据行数据返回图像。实际上,行中有一个图像列,如果行数据已更改,该列也会更改。Getimage从数据库返回此行-列值
Response.AddHeader ("Cache-Control", "max-age=0");
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