从代码隐藏中将图像添加到 div

Add images to div from Code Behind

我有一个div<div runat="server" id="mugshots_container"></div>。我想用来自 Code Behind 的 images 填充它。

这是我的代码:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    var timer = new System.Threading.Timer((x) => { RefreshMugshots(); }, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));
}

protected void RefreshMugshots()
{
    DataTable dt = this.ExecSprocReturnDataTable(SPROC_MUGSHOTS_GET);

    foreach (DataRow row in dt.Rows)
    {
        string identifier = row["identifier"].ToString();

        HtmlImage img = mugshots_container.Controls.OfType<HtmlImage>()
                                                   .SingleOrDefault((x => x.Attributes["identifier"] == identifier));

        if (img != null)
        {
            img.Src = ConvertByteArrayToBase64String(row["image"] as byte[]);
        }
        else
        {
            img = new HtmlImage() { Src = ConvertByteArrayToBase64String(row["image"] as byte[]) };
            img.Attributes.Add("identifier", identifier);

            mugshots_container.Controls.Add(img);
        }
    }
}

代码执行正常,HtmlImage 已添加到 mugshots_container 但我看不到图像在页面上。当我打开调试器时,div 仍然是空的。我做错了什么?

请求完成后,更改 img.src 等属性没有任何意义,因为没有任何客户端在网络的另一端侦听以重新绘制您的页面。

为此,您应该在客户端和服务器之间使用某种实时流,例如 SignalAir。 http://www.asp.net/signalr

这里有几个可能的问题。第一:

var timer = new System.Threading.Timer((x) => { RefreshMugshots(); }, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));

那是在一个单独的线程上执行。当您的线程执行时,原始事件已经完成并且页面已返回到浏览器。不会再发送数据,客户端也不会知道事情已经更新。删除时间并仅 运行 RefreshMugshots(); 与您的其他页面加载逻辑内联并查看您的图像是否显示。

第二件事是大多数浏览器对可以存储在 HTML 图像标签中的 base-64 编码数据量有限制。任何超过该限制的内容都会导致图像无法显示。

一种不需要处理线程和 SignalR 的替代(更简单)方法是使用客户端脚本(例如 setInterval(...) 调用一个处理程序 returns URL 获取更新后的图像,然后在 DOM 元素上适当设置图像源。

伪代码:

$(document).ready(function() {
    setInterval(function() {
        var newMugshotUrl = getMugshotUrl(someIdentifier);
        $('#myMugshotImage').attr('src', newMugshotUrl);
    }, 60000);
});