为什么我从中继器的不同图像视图中获取相同的图像 ID?

Why am I getting the same Image id from different Image view in a repeater?

我有一个中继器,可以幻灯片显示文件夹中的图像,这样当您单击幻灯片中的当前图像时,会打开一个产品页面,显示所选图像的详细信息。 同时,我有一个 productModel 列出了数据库中的所有图像,这样当您单击任何图像时,它会打开上面的图像产品页面。 现在,我担心的是我附加到转发器的超链接不断从转发器上出现的不同图像打开相同的产品页面。谁能帮我指出我做错了什么?我将不胜感激!

<ul class="bjqs">
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">  
<ItemTemplate><li>
<asp:HyperLink ID="link" runat="server">                       
<img src='<%# DataBinder.Eval(Container.DataItem,"Value") %>' 
  title='<%# (DataBinder.Eval(Container.DataItem,"Text").ToString()).Split('.')[0].ToString() %>' alt=""> 
   </asp:HyperLink></li>
</ItemTemplate>
</asp:Repeater>
</ul>

服务器端代码:

protected void Page_Load(object sender, EventArgs e)
{
    FillPage();
        string[] filePaths = Directory.GetFiles(Server.MapPath("~/pages/Management/Images/Products/"));
        List<ListItem> files = new List<ListItem>();
        foreach (string filePath in filePaths)
        {             
            string fileName = Path.GetFileName(filePath);   
            files.Add(new ListItem(fileName, "/pages/Management/Images/Products/" + fileName));
        }
        Repeater1.DataSource = files;
        Repeater1.DataBind();
    }
}

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

        ProductModel productModel = new ProductModel();
    List<Product> products = productModel.GetAllProducts();

    foreach (Product product in products)
    {
        Panel productPanel = new Panel();        
        HyperLink hp = (HyperLink)e.Item.FindControl("link");
        hp.NavigateUrl = "~/pages/Product.aspx?id=" + product.ID;
    }
}

你的转发器中的每个项目都具有相同 Link 的原因是,当你将一个项目绑定到转发器时,每个项目都会运行 ItemDataBound 事件。在该事件中,您循环遍历每个 Product 项目并在 foreach 循环中一遍又一遍地覆盖 HyperLink NavigateURL,直到列表中的最后一个产品是超链接的剩余值。

如果您设置断点并单步执行 ItemDataBound 事件,您将看到此行为。

我无法告诉您如何修复它,因为我根本看不出您打算如何将文件映射到产品。一旦你这样做了,我会建议将你的转发器绑定到产品列表,并添加一个 public 属性 到你的产品模型,它将保存你想要显示的图像的文件位置。然后可以在 ItemDataBound 事件或 aspx 标记中设置它,就像您现在使用 src 所做的那样。

有关 ItemDataBoundEvent 的一些信息,包括如何获取基础数据项。

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound(v=vs.110).aspx

   protected void Page_Load(object sender, EventArgs e)
{
    FillPage();
    if (!IsPostBack)
    {
        GetData(null, null, null, null);  
    }

    DbRetrival();

}


protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

    string ID = DataBinder.Eval(e.Item.DataItem, "ID").ToString();
    HyperLink hp = (HyperLink)e.Item.FindControl("link");
        hp.NavigateUrl = "~/pages/Product.aspx?id=" + ID ;

}


private void DbRetrival()
{
    string cs = ConfigurationManager.ConnectionStrings["SuperStoreDBConnectionString"].ConnectionString;
    SqlConnection con = new SqlConnection(cs);
    DataTable dt = new DataTable();
    SqlDataAdapter adp = new SqlDataAdapter("Select ID,Image,Name from Product",con );
    adp.Fill(dt);

        Repeater1.DataSource = dt;
    Repeater1.DataBind();
}

private void FolderRetrival()
{
    string[] filePaths = Directory.GetFiles(Server.MapPath("~/pages/Management/Images/Products/"));
    List<ListItem> files = new List<ListItem>();
    foreach (string filePath in filePaths)
    {

        string fileName = Path.GetFileName(filePath);
        files.Add(new ListItem(fileName, "/pages/Management/Images/Products/" + fileName));
    }
    Repeater1.DataSource = files;
    Repeater1.DataBind();
}

asp 页面:

  <asp:Repeater ID="Repeater1" runat="server"  OnItemDataBound="Repeater1_ItemDataBound">

<ItemTemplate>
    <li>

    <asp:HyperLink ID="link" runat="server">                       
        <br /> <asp:Image  runat="server" ImageUrl='<%#"~/pages/Management/Images/Products/" + String.Format("{0}",
                Eval("Image")) %>' Width='180px' Height='145px' /> </Image>
      <br />  <%# Eval("Name")%>

    </asp:HyperLink>
      </li>
   </ItemTemplate>