C# Net MVC,从数据库动态加载图像-图像闪烁
我正在从数据库加载一个图像,并在_Layout.cshtml中显示该图像 图像可以更改(登录后),每个公司可能有不同的图像,因此在登录后,我转到数据库并获取该公司对应的图像(基于其Id)。我需要保留这个加载的映像,不需要再次转到服务器 一切正常,我可以加载图像并显示在_布局中,但在每次请求后,图像都会“闪烁”,因为_布局正在重新创建 我按照问题(步骤1)从数据库加载图像 我拥有的代码是:C# Net MVC,从数据库动态加载图像-图像闪烁,c#,asp.net-mvc,C#,Asp.net Mvc,我正在从数据库加载一个图像,并在_Layout.cshtml中显示该图像 图像可以更改(登录后),每个公司可能有不同的图像,因此在登录后,我转到数据库并获取该公司对应的图像(基于其Id)。我需要保留这个加载的映像,不需要再次转到服务器 一切正常,我可以加载图像并显示在_布局中,但在每次请求后,图像都会“闪烁”,因为_布局正在重新创建 我按照问题(步骤1)从数据库加载图像 我拥有的代码是: public ActionResult CarregarLogoEmpresa() {
public ActionResult CarregarLogoEmpresa()
{
if (SecurityManager.Instance.Identity.IsAuthenticated)
{
var codigoEmpresaLogada = SecurityManager.Instance.Session.IdEmpresa;
var logoEmpresa = _empresaAppService.BuscarLogoEmpresa(codigoEmpresaLogada);
//return Json(Convert.ToBase64String(logoEmpresa), JsonRequestBehavior.AllowGet);
return File(logoEmpresa, "image/jpg");
}
return null;
}
并且认为:
<img src='@Url.Action("CarregarLogoEmpresa", "Image")' />
是否有办法保持图像加载而不是重新创建,避免每次都闪烁?无论是否从数据库加载,您的图像在每次请求时都会闪烁。由于每次从数据库中拉出图像所需的时间,这种影响可能会被放大。我建议你考虑另一个选择,如果你有一个。例如,如果您使用的是Azure或AWS,则可以使用文件/blob存储来承载映像,这可能比从数据库加载映像更快。我特别不喜欢将图像存储在数据库中,因为这样会很昂贵,而且备份会越来越大 回到“眨眼”问题。像GitHub这样的一些网站不会在每次请求时重新加载“布局”,只会加载更改的内容。实现这一点的标准库是
pjax
(我相信GitHub使用的是pjax)。尽管GitHub是在Rails上制作的,但该解决方案也应该适用于ASP.NET MVC
看一看:
pjax
(我相信GitHub使用的是pjax)。尽管GitHub是在Rails上制作的,但该解决方案也应该适用于ASP.NET MVC
看一看:
[OutputCache(Duration = 300, VaryByParam="none", Location = OutputCacheLocation.Client)]
关于行动结果
我不知道这是否是更好的方法,但至少在这种情况下,对我来说是有效的。经过一些研究后,我可以使用Asp.Net MVC ActionFilter进行分类
[OutputCache(Duration = 300, VaryByParam="none", Location = OutputCacheLocation.Client)]
关于行动结果
我不知道这是否是更好的方法,但至少在这种情况下,对我来说是有效的。这种闪烁可能是因为从数据库加载图像所花费的时间。我建议使用Asp.Net OutputCache以最小化此加载时间 行动:
[OutputCahce(VaryByParam="CodigoEmpresaLogada", Duration=30)]
public ActionResult CarregarLogoEmpresa(int CodigoEmpresaLogada)
{
if (SecurityManager.Instance.Identity.IsAuthenticated)
{
var logoEmpresa = _empresaAppService.BuscarLogoEmpresa(CodigoEmpresaLogada);
//return Json(Convert.ToBase64String(logoEmpresa), JsonRequestBehavior.AllowGet);
return File(logoEmpresa, "image/jpg");
}
return null;
}
视图:
发生此闪烁的原因可能是从数据库加载图像所需的时间。我建议使用Asp.Net OutputCache以最小化此加载时间 行动:
[OutputCahce(VaryByParam="CodigoEmpresaLogada", Duration=30)]
public ActionResult CarregarLogoEmpresa(int CodigoEmpresaLogada)
{
if (SecurityManager.Instance.Identity.IsAuthenticated)
{
var logoEmpresa = _empresaAppService.BuscarLogoEmpresa(CodigoEmpresaLogada);
//return Json(Convert.ToBase64String(logoEmpresa), JsonRequestBehavior.AllowGet);
return File(logoEmpresa, "image/jpg");
}
return null;
}
视图:
你能把你的密码贴出来吗?@antoinedelia准备好了!将图像放置在DB之外可能会允许浏览器缓存不“重新加载”它。或者查看一下MVC的PartialView,这样您就不必每次请求都重新加载布局了。@Mackan,我在这里做了一些测试,我可以在操作中使用[OutputCache]进行排序。由于图像必须加载一次(并且不会修改),您可以发布您的代码吗?@antoinedelia ready!将图像放置在DB之外可能会允许浏览器缓存不“重新加载”它。或者查看一下MVC的PartialView,这样您就不必每次请求都重新加载布局了。@Mackan,我在这里做了一些测试,我可以在操作中使用[OutputCache]进行排序。因为图像必须加载一次(并且不会修改),所以这是一个很好的分析点。当然,我会看看这些例子。现在,在做一些测试时,我可以使用[OutputCache]进行分类,我不知道这是否也是更好的方法。请更正或使用更好的word。。“您的图像在每次请求时都会闪烁,无论是否从数据库加载。”这不是真的。它“闪烁”的原因是每次从服务器中提取图像时,都会加载页面。将图像作为资源,即静态内容。。。将允许客户端浏览器/pc缓存图像。。。这意味着页面加载时不再“闪烁”。这里的建议是,如果图像是布局的一部分,则不应从db或mvc控制器加载图像,而应为正常的web内容。@Seabizkit,图像是从服务器动态加载的。这对同一个人来说是不一样的,我的意思是,如果有人登录,会为他显示一个图像,如果另一个人登录,会显示另一个图像。关键是,一旦加载此图像,它在处理过程中必须是相同的。顺便说一下,我可以使用MVC中的[OutputCache]进行分类@马图拉诺我明白你的意思。。我会有文件夹结构来支持这一点,动态创建它们,只保存相对路径,然后从数据库中获取路径,这是一个很好的分析点。当然,我会看看这些例子。现在,在做一些测试时,我可以使用[OutputCache]进行分类,我不知道这是否也是更好的方法。请更正或使用更好的word。。“您的图像在每次请求时都会闪烁,无论是否从数据库加载。”这不是真的。它“闪烁”的原因是