Немодифицированный DropDownList в UpdatePanel вызывает ошибку проверки событий в FireFox - PullRequest
3 голосов
/ 27 сентября 2011

Фон
У меня есть ASP.net UserControl, который представляет собой простую форму ввода пользователя.Он использует UpdatePanel и UpdaetProgress для отображения «рабочего» GIF после того, как они нажимают кнопку «Отправить».Мы получили сообщения о том, что кнопка отправки иногда ничего не делает в FireFox, IE 8 и Safari.Посмотрев на это, я не смог воспроизвести никаких проблем в IE, но обнаружил, что в FireFox кнопка отправки получила следующую ошибку сценария, которая препятствовала обратной передаче:

Error: Sys.WebForms.PageRequestManagerServerErrorException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Source File: http://localhost:1127/ScriptResource.axd?d=ZYU-uPMJ_AcQgBrmkW_WO13JlNZSAb9cMptxJsQIH1LnA8NC31pa7PAk8l5lYCB8LDDwft7xwh7Z107MKgt7KHHBeQaeEncnAFKLJ04CaHgelsuOOv072-1ZBvMW7N_x0&t=3693a5e0
Line: 1111

Проблема
Чтобы выяснить причину ошибки, я постепенно сокращал свой код, пока у меня почти ничего не осталось.Я обнаружил, что когда я выбираю из DropDownList в UpdatePanel, кнопка получает эту ошибку (только в FireFox).Если я удаляю DropDownList, не делаю выбор или удаляю UpdatePanel, кнопка отправки отправляется обратно правильно (любой из них).

Пример
Создание ASPПроект .net 3.5 и поместите приведенный ниже код на страницу aspx.Установите точку останова в вашем обработчике событий Page_Load или OnClick в коде позади.Запустите его, сделайте выбор из DropDownList и нажмите ClickSubmit.Обратите внимание, что точки останова не достигнуты.

<form id="form1" runat="server">
    <div>
        <asp:ScriptManager runat="server">
        </asp:ScriptManager>
        <div id="Div1" class="form-layout membership payment">
            <asp:UpdatePanel ID="UpdatePanel1" runat="server" RenderMode="Inline">
                <contenttemplate>
                    <table cellpadding="0" cellspacing="0" border="0" class="form_table payment">
                        <tr>
                            <th align="right" valign="top">
                                State <span class="reqd">*</span>
                            </th>
                            <td>

                                <asp:DropDownList Width="75px" ID="ddlState" CssClass="txt" runat="server" AutoPostBack="false">
                                    <asp:ListItem Value="" Text="--Select--" />
                                    <asp:ListItem>AB
                                    </asp:ListItem>
                                    <asp:ListItem>AL
                                    </asp:ListItem>
                                </asp:DropDownList>
                            </td>
                        </tr>
                    </table>
                    <div class="clear-left pad-bottom">
                    </div>
                    <asp:Label ID="lblCreditCardError" CssClass="creditCardError" runat="server">
                    </asp:Label>
                    <table cellpadding="0" cellspacing="0" border="0" class="form_table">
                        <tr>
                            <th align="right" valign="top">
                            </th>
                            <td>
                                <asp:HiddenField ID="HFSubmitForm" runat="server" Value="0" />
                                <asp:Button ID="btnTest" runat="server" OnClick="btnSubmitCC_Click" />
                            </td>
                        </tr>
                    </table>
                </contenttemplate>
            </asp:UpdatePanel>
        </div>
    </div>
</form>

Я не думаю, что использование разметки все равно имеет значение, но я попытался добавить элементы в DropDownList, используя привязку в блоке if (! IsPostBack) в методе Page_Load, но это ничего не изменило.

Ответы [ 3 ]

3 голосов
/ 27 сентября 2011

Я не уверен, вызывает ли это вашу проблему, но попробуйте правильно отформатировать DropDownList-Items:

<asp:DropDownList Width="75px" ID="ddlState" CssClass="txt" runat="server" AutoPostBack="false">
     <asp:ListItem Text="--Select--"></asp:ListItem>
     <asp:ListItem Text="AB"></asp:ListItem>
     <asp:ListItem Text="AL"></asp:ListItem>
</asp:DropDownList>
0 голосов
/ 28 сентября 2011

@ Тим Шмельтер: Ааа, это объясняет. (Ответьте в ответе, чтобы я мог показать код и убедиться, что ваш ответ ясен) Вот что ASP.NET отправляет в браузер:

<SELECT style="WIDTH: 75px" id=ddlState class=txt name=ddlState> 
    <OPTION selected value="">--Select--</OPTION> 
    <OPTION value="AB&#13;&#10;                                    ">AB</OPTION> 
    <OPTION value="AL&#13;&#10;                                    ">AL</OPTION>
</SELECT>

& # l3; & # l0 is / r / n. В IE все это значение, отображаемое выше, включено в HTML, но в FireFox оно сокращается до одного пробела (например, «AB»). Когда он передается обратно на сервер, он видит значение выбранной опции не то, которое было изначально включено. Я сравнил HTML, отправленный с тем, что было в FireFox, но я посмотрел на вышеупомянутый HTML в XML Visualizer Visual Studio, который также удалил их, поэтому я не заметил разницу.

0 голосов
/ 27 сентября 2011

Во-первых, вам не хватает этого в вашей UpdatePanel:

<Triggers>
    <asp:AsyncPostBackTrigger ControlID="btnTest" />
</Triggers>

Во-вторых ... либо связать параметры списка в выделенном фрагменте кода, отключить проверку событий для этой страницы, либо вызвать RegisterForEventValidtion () для каждого из ваших параметров, я полагаю. Я немного отрывочен в этом последнем, так как я никогда не использовал его. Я смог заставить ваш код работать, просто добавив AsyncPostBackTrigger и затем связав DDL в коде позади.

Наконец, возможно, вы просто упускаете эти необработанные исключения при отладке, потому что ожидаете чего-то от браузера ... но на самом деле браузеру должно показаться, что ничего не произошло. Потяните EventViewer, чтобы увидеть необработанные исключения ASP.NET. Исключением является остановка выполнения до того, как вы получите обработчик события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...