Below are my code, design and model parts
In my NewsletterHistoryModel I keep some information of the newsletter and the news in it as a list.
I can print the newsletter's information to the first repeater with the following actions. But when I try to print the titles of the news to the repeater in it, wrong values come. I'm trying to do this in the ItemDataBound of the first repeater.
Correct values are not coming for child repeater. All newsletters coming the same 4 news titles.
How can I solve this problem?
ascx.cs
List<NewsletterHistoryModel> newsletterHistoryModel;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindDataNewsLetter();
}
}
public void BindDataNewsLetter()
{
newsletterHistoryModel = new List<NewsletterHistoryModel>();
var dataList = NewsletterLayer.SelectListNewsletterByPublish();
List<NewsletterDetailsModel> newsletterDetailsModel = new List<NewsletterDetailsModel>();
if (dataList.Count > 0)
{
foreach (var item in dataList)
{
List<NewsModel> newsModels = new List<NewsModel>();
newsletterDetailsModel = NewsletterDetailsLayer.SelectNewsLetterDetailWithNewsLetter(item.Title);
foreach (var x in newsletterDetailsModel)
{
//newsModels.Add(NewsLayer.SelectNews(x.NewsId));
newsModels.Add(NewsLayer.SelectNews(x.NewsId));
}
newsletterHistoryModel.Add(new NewsletterHistoryModel
{
Id = item.Id,
Issue = item.Issue,
Year = item.Year,
Month = item.Month,
Day = item.Day,
PreviewLink = item.PreviewLink,
AttachmentUrl = item.CoverPhoto,
newsModels = newsModels
});
}
rptNewsItems.DataSource = newsletterHistoryModel;
rptNewsItems.DataBind();
}
}
protected void rptNewsItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater rptNews = e.Item.FindControl("rptNews") as Repeater;
foreach (var item in newsletterHistoryModel)
{
rptNews.DataSource = item.newsModels;
rptNews.DataBind();
}
}
}
ascx.designer.cs
<asp:Repeater runat="server" ID="rptNewsItems" OnItemDataBound="rptNewsItems_ItemDataBound">
<ItemTemplate>
<a href="<%# Eval("PreviewLink") %>" class="card2 col-12 col-md-3">
<h4 class="card-issue">#<%# Eval("Issue") %> - <%# Eval("Day") %> <%# Eval("Month") %> <%# Eval("Year") %></h4>
<img class="card-img-top" src="<%# Eval("AttachmentUrl") %>">
<div class="card-body">
<asp:Repeater runat="server" ID="rptNews">
<ItemTemplate>
<h4 class="card-description">#<%# Eval("Title") %></h4>
</ItemTemplate>
</asp:Repeater>
</div>
</a>
</ItemTemplate>
</asp:Repeater>
NewsletterHistoryModel
public int Id { get; set; }
public string Issue { get; set; }
public string Year { get; set; }
public string Month { get; set; }
public string Day { get; set; }
public string PreviewLink { get; set; }
public string AttachmentUrl { get; set; }
public List<NewsModel> newsModels { get; set; }
I solved the problem. Without the need for ItemDataBound. I have given the list of newsModel that I keep in the Model to the datasource of my child repeater.
<asp:Repeater runat="server" ID="rptNewsItems" >
<ItemTemplate>
<a href="<%# Eval("PreviewLink") %>" class="card2 col-12 col-md-3">
<h4 class="card-issue">#<%# Eval("Issue") %> - <%# Eval("Day") %> <%# Eval("Month") %> <%# Eval("Year") %></h4>
<img class="card-img-top" src="<%# Eval("AttachmentUrl") %>">
<div class="card-body">
<asp:Repeater runat="server" ID="rptNews" DataSource='<%# Eval("newsModels") %>'>
<ItemTemplate>
<h4 class="card-description"># <%# Eval("Title") %></h4>
</ItemTemplate>
</asp:Repeater>
</div>
</a>
</ItemTemplate>
</asp:Repeater>