2015-02-05 4 views
1

У меня проблема с 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 символы, которые вызывали проблемы в постбэка.

ответ

0

Вы получите ошибку JavaScript в консоли браузера.

Uncaught Sys.WebForms.PageRequestManagerServerErrorExce ption: Sys.WebForms.PageRequestManagerServerErrorException: неверный postback или аргумент обратного вызова. Проверка событий разрешена с использованием в конфигурации или <% @ Страница EnableEventValidation = "true"%> на странице. В целях безопасности эта функция проверяет, что аргументы для событий обратной передачи или обратного вызова происходят из серверного элемента управления, который изначально их представлял. Если данные действительны и ожидаются, используйте метод ClientScriptManager.RegisterForEventValidation для того, чтобы зарегистрировать данные обратной передачи или обратного вызова для проверки. MsAjaxJs v = c42ygB2U07n37m_Sfa8ZbLGVu4Rr2gsBo7MvUEnJeZ81:? 1 Uncaught Sys.WebForms.PageRequestManagerServerErrorException: Sys.WebForms.PageRequestManagerServerErrorException: Недопустимый постбэк или аргумент обратного вызова. Проверка событий разрешена с использованием в конфигурации или <% @ Страница EnableEventValidation = "true"%> на странице. В целях безопасности эта функция проверяет, что аргументы для событий обратной передачи или обратного вызова происходят из серверного элемента управления, который изначально их представлял. Если данные действительны и ожидаются, используйте метод ClientScriptManager.RegisterForEventValidation для того, чтобы зарегистрировать данные обратной передачи или обратного вызова для проверки.

Вы можете увидеть более простой вариант, если вы используете:

msgList.DataSource = new List<string>(){"A\r\n","B\r\n","C\r\n"}; 

Когда вы смотрите его во вкладке браузера, вы увидите запрос POST отправляется на сервер, но на стороне сервера в Page_Load метод вообще не пострадает.

Исправление состоит в том, чтобы не использовать символы \r\n в данных, используемых для списка ListBox, или следовать указаниям по его регистрации: ClientScriptManager.RegisterForEventValidation on MSDN.

+0

Невероятно. Он отлично работает, когда я добавляю 'msgList.DataSource = новый Список () {"A", "B", "C"}; ' И проблема в переопределенном' .ToString() 'в классе' Message'. Я поместил '\ r \ n' в метод, и что-то не понравилось. Когда я удалил это, все остальное работало отлично. Проблема решена! – nighthawk

+1

@nighthawk Я обновил решение. В любом случае, я рекомендую никогда не использовать UpdatePanel. Вместо этого переключитесь на использование [ASP.NET Web API] (http://www.asp.net/web-api) вместе с инфраструктурой сценариев на стороне клиента (например, jQuery), что упрощает AJAX. – mason

+0

Я, вероятно, переключу его на WebAPI, поскольку UpdatePanel вызывает много проблем (например, этот), и он замедляет работу страниц. – nighthawk

Смежные вопросы