ASP.NET: кнопка внутри ListView внутри панели обновления вызывает полную обратную передачу

<script type="text/javascript">

    function ClientSideClick(myButton) {
        //make sure the button is not of type "submit" but "button"
        if (myButton.getAttribute('type') == 'button') {
            // disable the button
            myButton.disabled = true;
            //myButton.className = "btn-inactive";
            myButton.value = "Posting...";
        }
        return true;
    }

</script>



<asp:UpdatePanel ID="upComments" runat="server" UpdateMode="Always" >
    <ContentTemplate>

        <asp:ListView ... >

            <asp:Button ID="btnSubPostComment" runat="server" Text="Reply Comment"
                        CommandName="cmdPostSubComment" OnClientClick="ClientSideClick(this)" UseSubmitBehavior="false"

        </asp:ListView>

    </ContentTemplate>
</asp:UpdatePanel>

Функция Javascript (ClientSideClick) отключает кнопку во время ее обработки.

Проблема в том, что когда я включаю OnClientClick="ClientSideClick" UseSubmitBehavior="false" в свою кнопку, даже если она находится внутри панели обновления, это вызывает полную обратную передачу.

Если я удалю эти два свойства OnClientClic и UseSubmitBehavior, кнопка не вызовет полной обратной передачи. кто-нибудь знает, почему это произошло?

Все, что я хотел сделать, это отключить кнопку и изменить ее текст, чтобы предотвратить множественные отправки.


person Eric Bergman    schedule 12.01.2013    source источник
comment
Вы пробовали без Return true ?   -  person 2GDev    schedule 13.01.2013
comment
@2GDev Return true используется для повторного включения кнопки, но даже без этой строки он по-прежнему заставляет кнопку вызывать полную обратную передачу.   -  person Eric Bergman    schedule 13.01.2013
comment
@EricBergman - Как вы думаете, почему это вызывает полную обратную передачу? Я протестировал ваш код, и он выполняет частичную обратную передачу... Вы пробовали его на новой странице без какой-либо другой логики, которая могла бы мешать?   -  person Blachshma    schedule 13.01.2013


Ответы (1)


Я не уверен, что это именно то, что вы ищете, но я обычно использую это:

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<script type="text/javascript">
var pbControl = null;
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(BeginRequestHandler);
prm.add_endRequest(EndRequestHandler);

function BeginRequestHandler(sender, args) {
    pbControl = args.get_postBackElement();
    pbControl.disabled = true;
}
function EndRequestHandler(sender, args) {
    pbControl.disabled = false;
    pbControl = null;
}
</script>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:ListView ... >
            <asp:Button ID="btnSubPostComment" runat="server" Text="Reply Comment" CommandName="cmdPostSubComment" OnClientClick="this.value='Posting...';" />
        </asp:ListView>
    </ContentTemplate>
</asp:UpdatePanel>

Единственная проблема заключается в том, что при повторном нажатии той же кнопки после первой асинхронной обратной передачи возникает ошибка «Операция недействительна из-за текущего состояния объекта». Это может отображаться как исключение javascript в виде внутренней ошибки сервера 500. Проведя небольшое исследование, я наткнулся:

Microsoft недавно (29-12-2011) выпустила обновление для устранения нескольких серьезных уязвимостей безопасности в .NET Framework. Совсем недавно был представлен MS11-100, который обрабатывает потенциальные DoS-атаки. отправленных данных (полей формы). MS11-100 устанавливает ограничение в 500 для элементов обратной передачи. Новое максимальное значение по умолчанию, введенное последним обновлением безопасности, составляет 1000».

Скотт Гу пишет об этом здесь: http://weblogs.asp.net/scottgu/archive/2011/12/28/asp-net-security-update-shipping-thursday-dec-29th.aspx

Добавление ключа настройки в файл веб-конфигурации устраняет эту ошибку:

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="2000" />
</appSettings>
person Jonty    schedule 15.01.2013