2016-11-16 6 views
-1

У меня есть ретранслятор, в котором слайд показывает изображения из папки, так что, когда вы нажимаете на текущее изображение на слайде, открывается страница продукта, которая показывает информацию о деталях выбранного изображения. Между тем, у меня есть 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; 
    } 
} 
+0

Почему вы получаете новый список продуктов и перекручивание через них в вашем случае ItemDataBound? Я не уверен, что вы делаете, но с беглым взглядом кажется, что существует фундаментальное неправильное использование события ItemDataBound. –

+0

Не могли бы вы определить, где я ошибся? –

+0

Я не могу вам помочь, потому что я не знаю, что вы пытаетесь сделать. Событие ItemDataBound будет запускаться для каждого отдельного элемента в вашем списке файлов (независимо от того, к чему вы привязываетесь). Вы можете получить доступ к каждому элементу в RepeaterItemEventArgs e, чтобы получить то, что вы хотите от него. По-видимому, все, к чему вы привязываетесь, это строковый объект с именем файла. Возможно, вы хотите привязать к списку продуктов, а затем присоединить каждый продукт к файлу? На самом деле это зависит от вас. Надеемся, что понимание ретранслятора и события ItemDataBound поможет вам понять, что вы хотите сделать лучше. –

ответ

-1
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: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> 

1

Причина у вас есть же ссылка для каждого элемента в ретранслятора является то, что при привязке элемента к ретранслятору каждый элемент проходит событие ItemDataBound. Внутри этого события вы прокручиваете каждый элемент продукта и перезаписываете HyperLink NavigateURL снова и снова в цикле foreach, пока LAST-продукт в списке не останется для гиперссылки.

Если вы установите точку останова и пройдете через событие ItemDataBound, вы увидите это поведение.

Я не могу сказать вам, как это исправить, потому что я просто не вижу, как вы планируете сопоставить файл с Продуктом. Как только вы это сделаете, я предлагаю связать ваш ретранслятор с продуктом и добавить общедоступное свойство к вашей модели продукта, которое будет содержать расположение файла изображения, которое вы хотите показать. Затем это можно было бы установить в событии ItemDataBound или в разметке aspx, как вы сейчас делаете с src.

Некоторая информация о ItemDataBoundEvent, в том числе о том, как получить базовый элемент данных.

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

+0

Спасибо, Адам, по крайней мере, вы заставляете меня понять, что трудно сопоставить файл с Продукт, который оставляет меня без выбора, чем искать другие альтернативы для достижения моей цели. Без использования подхода файловой системы, есть ли в любом случае я могу создать слайд-шоу (изображение и метку) из db? Если да, то я буду признателен некоторые образцы. –

+0

С другой стороны, есть ли способ добавить ярлык с идентификатором продукта и использовать Eval для установки значения. Затем в событии itemdatabound найдите элемент управления и установите URL-адрес гиперссылки? –