Asp.Net MVC,从数据库动态加载图像 - 图像闪烁

时间:2016-12-12 10:46:00

标签: c# asp.net-mvc

我正在从数据库加载图像并在_Layout.cshtml中显示此图像。

图像可以更改(登录后)并且每个公司可能有不同的图像,因此在登录后,我会转到数据库并获取该公司的相应图像(基于它的ID)。我需要保留这个加载的图像,而不需要再次访问服务器。

一切正常,我可以加载图像并在_Layout中显示,但在每次请求后,图像“闪烁”,因为正在重新创建_Layout。

我已按照this个问题(步骤1)从数据库加载图片。

我的代码是:

    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")' />

是否有办法保持图像加载而不是重新创建,避免每次都闪烁?

3 个答案:

答案 0 :(得分:3)

由于从数据库加载图像所花费的时间,可能会发生此闪烁。我建议使用Asp.Net OutputCache以最小化此加载时间。

动作:

<a href="#/profile/add/ " class="btn-floating " title="Add a profile ">
      <i class="fa fa-plus "></i>
    </a>

查看:

[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;
}

答案 1 :(得分:1)

无论是否从数据库加载,您的图像都会在每个请求上闪烁。由于每次将图像拉出数据库所花费的时间,这种效果可能会被放大。我建议你考虑另一种选择,如果你有的话。例如,如果您使用的是Azure或AWS,则可以使用文件/ blob存储来托管映像,这可能比从数据库加载映像更快。我特别不喜欢在数据库上存储图像,因为它很昂贵且备份变得更大。

回到“眨眼”问题。像GitHub这样的网站不会在每个请求上重新加载“布局”,只会更改内容。这样做的标准库是pjax(我相信GitHub使用pjax)。即使GitHub是在Rails上制作的,该解决方案也适用于ASP.NET MVC。

看看:

答案 2 :(得分:0)

经过一些研究,我可以使用Asp.Net MVC ActionFilter

对其进行排序
<defs>
    <marker id="circle1" markerWidth="8" markerHeight="8" refX="5" refY="5">
        <circle cx="5" cy="5" r="3"></circle>
    </marker>
</defs>

在ActionResult上。

我不知道这是否是更好的方法,但对于这种情况,至少对我有用。