У меня проблема с UpdatePanel (ASP.Net WebForms, .Net 4.0). Вот код:UpdatePanel триггеры не срабатывают
<div class="container-fluid">
<form id="form1" runat="server">
<h2>Poruke</h2>
<div class="row">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" />
<asp:UpdatePanel ID="msgListUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
<ContentTemplate>
<div class="col-md-4">
<asp:ListBox ID="msgList" runat="server" OnSelectedIndexChanged="msgList_SelectedIndexChanged" AutoPostBack="true" ClientIDMode="AutoID"></asp:ListBox>
</div>
<div class="col-md-8">
<asp:ListBox ID="conversationList" runat="server" ClientIDMode="AutoID"></asp:ListBox>
<br class="divider" />
<p>
Odgovor: <span>
<asp:TextBox ID="replyTxtbox" runat="server"></asp:TextBox></span>
</p>
<asp:Button ID="sendBtn" runat="server" Text="Pošalji" OnClick="sendBtn_Click" EnableViewState="false" ClientIDMode="AutoID" />
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="msgList" EventName="SelectedIndexChanged"/>
</Triggers>
</asp:UpdatePanel>
</div>
</form>
</div>
и это отделенный код ...
int userIdCookie = 0;
message selected = new message();
protected void Page_Load(object sender, EventArgs e)
{
if (!this.Page.User.Identity.IsAuthenticated)
{
FormsAuthentication.RedirectToLoginPage();
}
if (!Page.IsPostBack)
{
if (Int32.TryParse(HttpContext.Current.User.Identity.Name, out userIdCookie))
{
message msg = new message();
var allMsg = msg.allMessagesFormatted().Distinct().ToList();
msgList.DataSource = allMsg;
msgList.DataBind();
}
}
else
{
// test only!
replyTxtbox.Text = msgList.SelectedIndex.ToString();
msgListUpdatePanel.Update();
}
}
protected void msgList_SelectedIndexChanged(object sender, EventArgs e)
{
message msg = new message();
var allMsg = msg.allMessagesFormatted().Distinct().ToList();
msgList.DataSource = allMsg;
IList<message> boundList = (IList<message>)msgList.DataSource;
selected = boundList[msgList.SelectedIndex];
var conversation = msg.allMessagesFormatted().FindAll(x => x.conversationGuid == selected.conversationGuid);
conversationList.DataSource = conversation;
conversationList.DataBind();
}
protected void sendBtn_Click(object sender, EventArgs e)
{
if(selected.recipientId != 0)
{
message newmsg = new message();
newmsg.senderId = userIdCookie;
newmsg.recipientId = selected.recipientId;
newmsg.subject = selected.subject;
newmsg.messageTxt = replyTxtbox.Text;
newmsg.conversationGuid = selected.conversationGuid;
newmsg.time = DateTime.Now;
newmsg.Add();
}
}
msgList получает заселен нормально, но когда я изменить выбор, ничего не происходит - его SelectedIndex событие не срабатывает. Если я установил AutoPostBack = "true" в этот список, он перезагрузит страницу (именно этого я и стараюсь избежать).
Подводя итог - когда я нажимаю элемент в ListBox внутри UpdatePanel, ничего не происходит (событие не запускается). Я хочу избежать перезагрузки страницы, когда выбранный индекс изменяется. Я пробовал десяток решений (ClientID, AsyncPostBack, «обычные» Postback триггеры и я предполагаю, что я пропустил одну простую деталь, и это сводит меня с ума
Может кто-нибудь помочь
редактировать -.?, Как @mason указал , проблема была в overidden message.ToString()
метод, который содержал \r\n
символы, которые вызывали проблемы в постбэка.
Невероятно. Он отлично работает, когда я добавляю 'msgList.DataSource = новый Список() {"A", "B", "C"}; ' И проблема в переопределенном' .ToString() 'в классе' Message'. Я поместил '\ r \ n' в метод, и что-то не понравилось. Когда я удалил это, все остальное работало отлично. Проблема решена! –
nighthawk
@nighthawk Я обновил решение. В любом случае, я рекомендую никогда не использовать UpdatePanel. Вместо этого переключитесь на использование [ASP.NET Web API] (http://www.asp.net/web-api) вместе с инфраструктурой сценариев на стороне клиента (например, jQuery), что упрощает AJAX. – mason
Я, вероятно, переключу его на WebAPI, поскольку UpdatePanel вызывает много проблем (например, этот), и он замедляет работу страниц. – nighthawk