来自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显示未检索到当前行图像。
答案 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
标头看起来很可疑。我没有。