#c# #asp.net #listview
#c# #asp.net #listview
Вопрос:
сначала это казалось простым, но я не могу заставить его работать.
У меня следующий сценарий:
<asp:ListView ID="CommentsListView" runat="server">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</LayoutTemplate>
<ItemTemplate>
<UC:Comment runat="server" CommentItem="<%# CurrentComment %>" />
<br />
</ItemTemplate>
</asp:ListView>
<asp:TextBox ID="NewComment" runat="server" />
<asp:ImageButton ImageUrl="/images/ball.png" runat="server"
OnClick="SubmitComment" />
Код:
protected void Page_Load(object sender, EventArgs e)
{
RenderListView();
}
protected void RenderListView()
{
CommentsListView.DataSource = //Get the data source objects
CommentsListView.DataBind();
}
protected CommentObject CurrentComment
{
get { return (CommentObject)Page.GetDataItem(); }
}
protected void SubmitComment(object sender, ImageClickEventArgs e)
{
//code to submit comment
RenderListView();
}
в принципе, когда я отправляю комментарий, я хочу видеть его в ListView, но я этого не делаю. «MyControl» получает нулевой комментарий в обратной публикации для всех элементов (не только для нового).
Только после обновления страницы я могу увидеть новый комментарий, который я отправил. Однако я не могу обновлять страницу при каждой отправке, потому что этот код находится внутри UpdatePanel (проблема возникает и без UpdatePanel).
Есть идеи, как это решить?
Ответ №1:
Я не могу найти никаких подробностей по этому поводу, но у меня есть подозрение, что проблема вызвана пользовательским элементом управления в вашем ItemTemplate. Можете ли вы удалить его и посмотреть, работает ли это?
Комментарии:
1. Устранение проблемы не решает ее 🙂 Проблема в том, что элемент управления получает значение null
CurrentComment
. За пределами UC все работает.
Ответ №2:
Я заметил, что вы вызываете RenderListView как в SubmitComment, так и в PageLoad, что, как я полагаю, приведет к его повторному запуску при нажатии кнопки (при первом запуске PageLoad). Похоже, что опубликованный вами код упрощен. Возможно ли, что в загрузке страницы что-то происходит, что саботирует ваши шаги SubmitComment?
Комментарии:
1. эй, Джозеф, Page_Load больше ничего не делает, я не вижу, как это саботирует отправку. Я должен отметить, что отправка работает, и источник данных всегда получает действительный список ненулевых комментариев, проблема только в UC, который, похоже, не получает объект comment (но вместо этого получает null).
Ответ №3:
Я, наконец, решил это, если кто-то еще может столкнуться с этим —
Решение состояло в том, чтобы избежать «<%#» и вместо этого использовать событие ItemDataBound:
<asp:ListView ID="Comments" runat="server"
OnItemDataBound="CommentsItemDataBound">
и сам метод:
protected void CommentsItemDataBound(object sender, ListViewItemEventArgs e)
{
var commentItem = (Comment)(((ListViewDataItem)e.Item).DataItem);
var commentControl = (Comment)e.Item.FindControl("CommentControl");
commentControl.CommentItem = commentItem;
}
Таким образом, привязка каждого элемента управления работает должным образом.