C#ASP.net使用HTTPHandler将图像从列表绑定到GridView

C#ASP.net使用HTTPHandler将图像从列表绑定到GridView,c#,asp.net,httphandler,C#,Asp.net,Httphandler,我目前有一个gridview,应该使用自定义HttpHandler填充多个图像预览。我已经有物品清单了。问题是,每当我尝试实现绑定时,所有被绑定的图像都来自项目列表的最后一个条目,而不考虑其他项目。我想知道为什么会这样 MyHandler.ashx: List<string> items = new List<string>(); items = ItemManager.GetImages(); public void ProcessRequest (HttpCon

我目前有一个gridview,应该使用自定义HttpHandler填充多个图像预览。我已经有物品清单了。问题是,每当我尝试实现绑定时,所有被绑定的图像都来自项目列表的最后一个条目,而不考虑其他项目。我想知道为什么会这样

MyHandler.ashx:

List<string> items = new List<string>();
items = ItemManager.GetImages();


 public void ProcessRequest (HttpContext context) {
        WebClient client = new WebClient();
        if (items.Count > 0)
        {         
            foreach (var a in items)
            {
                byte[] buff = client.DownloadData(a);
                context.Response.ContentType = "image/jpeg";
                context.Response.AddHeader("content-length", buff.Length.ToString());
                context.Response.BinaryWrite(buff);
            }              
        }      
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
List items=newlist();
items=ItemManager.GetImages();
公共void ProcessRequest(HttpContext上下文){
WebClient客户端=新的WebClient();
如果(items.Count>0)
{         
foreach(项目中的var a)
{
字节[]buff=客户端下载数据(a);
context.Response.ContentType=“image/jpeg”;
context.Response.AddHeader(“content-length”,buff.length.ToString());
context.Response.BinaryWrite(buff);
}              
}      
}
公共布尔可重用{
得到{
返回false;
}
}
Gridview.aspx

<asp:GridView ID="gv1" style="text-align:center;" PageSize="6" Width="100%" AutoGenerateColumns="false" runat="server" BackColor="White" BorderColor="Black" BorderStyle="None" BorderWidth="1px" CellPadding="10"
                         AllowPaging="true">
                            <Columns>

                                <asp:ButtonField ButtonType="Button" CommandName="Select" ControlStyle-Width="100" ControlStyle-Height="30" Text="Update" HeaderText="Update"/>
                                <asp:ButtonField ButtonType="Button" CommandName="Delete" ControlStyle-Height="30" Text="Delete" HeaderText="Delete"/>


                                <asp:BoundField DataField="a" HeaderText="ID" />
                                <asp:BoundField DataField="b" HeaderText="Title" />
                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <img src="MyHandler.ashx" class="gridview-imgPreview" />
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:BoundField DataField="c" HeaderText="Caption" />
                                <asp:BoundField DataField="d" HeaderText="Description" />

                            </Columns>


您在哪里告诉处理程序要显示哪个图像?处理程序代码看起来像是重新获取整个图像列表并返回所有图像。这将导致客户端只接收到第一个或最后一个文件,这取决于底层系统如何处理您在一个响应中返回多个文件的尝试。我相信它位于以下块:
foreach(项目中的var a){byte[]buff=client.DownloadData(a);context.Response.ContentType=“image/jpeg”;context.Response.AddHeader(“content-length”,buff.length.ToString());context.Response.BinaryWrite(buff);}
还是我遗漏了什么?你肯定遗漏了什么。那个块叫做循环。它迭代所有记录,并对所有记录重复相同的操作。您的
img
标记实际上没有告诉处理程序要显示哪个图像。您可能应该在
src
URL中包含记录的ID,然后在处理程序中读取该ID以仅获取一个图像将在列表中的每个项目中写入图像文件。或者有没有其他方法可以在不包含ID的情况下实现这一点?它只写一个条目。在循环中这样做会写入所有项。你知道什么是循环吗?看起来你只是随机地指向代码行,猜测“这一行一定是问题所在”。问题在于指向处理程序的链接没有告诉处理程序要显示哪个图像,而处理程序正试图显示所有图像。我不完全记得旧web表单中的语法,但您需要在图像URL中传递ID。然后,您可以在处理程序中使用该ID来查找正确的图像。