остановить двойной постбэк - PullRequest
       13

остановить двойной постбэк

3 голосов
/ 17 сентября 2009

Вот что я делаю. Я создаю две кнопки в строке заголовка сетки, которую я создал. Кнопки + страница и-страницы. Когда нажата кнопка -page, я удаляю страницу, и все данные исчезают со страницы, и страница исчезает, а страница + появляется.

Вот моя проблема Когда я нажимаю + страницу, я должен выполнить двойную обратную передачу, потому что одна строка моих данных исчезает. Я приведу код ниже. Что я могу сделать, чтобы это исправить ??

Dim bttnrempag As New Button
    bttnrempag.ID = "bttnrempag"
    bttnrempag.Text = "      Paging"
    bttnrempag.CssClass = "bttnMinEG"
    bttnrempag.ValidationGroup = "alone"
    bttnrempag.Attributes.Add("onclick", "return Paging('1')")

    Dim bttnallowpag As New Button
    bttnallowpag.ID = "bttnallowpag"
    bttnallowpag.Text = "      Paging"
    bttnallowpag.ValidationGroup = "alone"
    bttnallowpag.CssClass = "bttnAddEG"
    bttnallowpag.Attributes.Add("onclick", "return Paging('0')")

--------------------- Как добавляются кнопки ------------------ ------------------------

    Dim row As New GridViewRow(-1, -1, DataControlRowType.Separator, DataControlRowState.Normal)
    row.Cells.Add(cell)
    cell.Controls.Add(bttnrempag) '36
    cell.Controls.Add(bttnallowpag)

-------------------------------------------- --------------------------------------------

function Paging(remove) {
    var gridView = $get('<%=Gridview1.ClientID %>');
    var txt2 = $get('<%=TextBox2.ClientID %>');
    if (remove == '1') {
        txt2.value = '1';
        __doPostBack('<%=UpdatePanel1.ClientID %>', '');
        return false;
    }
    else {
        txt2.value = '0';
        __doPostBack('<%=UpdatePanel1.ClientID %>', '');
        return false;
    }

Отредактировано

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate >
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            AutoGenerateColumns="False" BackColor="White" BorderColor="#E7E7FF" 
            BorderStyle="None" BorderWidth="1px" CellPadding="3" 
            DataSourceID="SqlDataSource1" Font-Names="Comic Sans MS" Font-Size="XX-Small"
            Caption = '<table border="" width="100%" cellpadding="3" cellspacing="0" bgcolor="#4A3C8C"><tr><td style = "font-size:X-large;font-family:Arial CE;color:White"><b>Ordering/Receiving Log</u></td></tr></table>' 
            Font-Bold="True" PageSize="15" >
            <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />

            <Columns>
                      Bound Data
            </Columns>
            <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
            <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />
            <EmptyDataTemplate>
            <head>
                <meta http-equiv="refresh" content="5;URL=/Corporate_newpo/ReceivingLog.aspx?">
            </head>
                <script type="text/javascript" >
                    var count = 6;
                    var counter = setInterval("timer()", 1000); //1000 will  run it every 1 second

                    function timer() {
                        count = count - 1;
                        if (count <= 0) {
                            clearInterval(counter);
                            //counter ended, do something here
                            return;
                        }
                        $get("timer").innerHTML = "The Table will Reload in " + count + " secs";
                    }
                </script>
                <asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Size="Large" 
                    ForeColor="#993333" Text="No Data was Found for the Selected Filter"></asp:Label><br /><br />
               <span id="timer" style="font-size:medium;color:blue"></span>
            </EmptyDataTemplate>
            <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
            <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
            <AlternatingRowStyle BackColor="#F7F7F7" />
            <PagerTemplate>
                <small 12px""="" style="font-size:xx-small; padding-right">Go To Page</small>
                <asp:DropDownList ID="ddlPageSelector" runat="server" AutoPostBack="true" 
                    Font-Size="XX-Small" Height="19px" Width="36px">
                </asp:DropDownList>
                <asp:ImageButton ID="btnFirst" runat="server" CommandArgument="First" 
                    CommandName="Page" SkinID="pagefirst" />
                <asp:ImageButton ID="btnPrevious" runat="server" CommandArgument="Prev" 
                    CommandName="Page" SkinID="pageprev" />
                <asp:ImageButton ID="btnNext" runat="server" CommandArgument="Next" 
                    CommandName="Page" SkinID="pagenext" />
                <asp:ImageButton ID="btnLast" runat="server" CommandArgument="Last" 
                    CommandName="Page" SkinID="pagelast" />
            </PagerTemplate>
            </asp:GridView>
        </ContentTemplate> 
    </asp:UpdatePanel>

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

Ответы [ 7 ]

2 голосов
/ 17 сентября 2009

Я подозреваю, что это потому, что вы вызвали метод __doPostBack. Обычное поведение нажатия кнопок по умолчанию будет выполнять асинхронную обратную передачу, вы, вероятно, сделали это в другой раз. Попробуйте удалить его и посмотреть, как оно идет.

1 голос
/ 14 июля 2011

Пожалуйста, посмотрите HTML, как он отображается на странице:

Каждый раз, когда он присутствует

<img src=""/>

возможна двойная обратная передача, для некоторых браузеров ...

Эту проблему можно решить, установив пустое изображение по умолчанию для каждой кнопки

<asp:ImageButton ImageUrl="~/Images/blank.gif"...>

В любом случае, эту команду можно ввести в Immediate Window, если вы установите точку останова внутри Page_Load и позволите идентифицировать элемент управления, вызвавший обратную передачу

Page.Request.Params["__EVENTTARGET"];
1 голос
/ 02 октября 2009

Попробуйте изменить теги на обычные теги HTML image.

Я сталкивался с такими вещами, которые раньше было трудно диагностировать и еще труднее объяснить. Смотрите здесь и здесь , чтобы узнать о некоторых ошибках, которые могут помочь. Если у вас есть imageтеги с пустыми атрибутами src, то предоставленные мной гиперссылки, вероятно, объяснят проблему. Если у вас нет пустых тегов image, продолжайте читать для моей работы вокруг.

В моем конкретном случае это происходило только на некоторых серверах (на некоторых клиентских сайтах), но не на других, поэтому я не смог найти никаких конкретных проблем с кодом. Мой обходной путь состоял в том, чтобы изменить мои на обычные imageтеги с событиями щелчка JavaScript, которые будут вызывать функцию для выполнения обратной передачи, во многом аналогично вашей функции Paging ().

По какой-то причине я обнаружил, что с событием возврата onclick на стороне клиента: подтверждают ('вы уверены?'); остановит обратную передачу, если подтвердите () возвращает ложь, однако возвращая ложь, как вы делаете это в своей функции Paging () после ручного вызова __doPostBack, не всегда останавливает повторную публикацию страницы.

1 голос
/ 01 октября 2009

Можете ли вы попытаться поместить атрибут Click на кнопки в объявлении события RowDataBound ??

Приветствие.

0 голосов
/ 22 ноября 2010

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

using System.Linq;

private void GridView_OnItemDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var buttons = e.Row.Cells.OfType<DataControlFieldCell>().SelectMany(item => item.Controls.OfType<ImageButton>());
        foreach (ImageButton imageButton in buttons)
        {
            var argument = imageButton.CommandName + "$" + imageButton.CommandArgument;
            imageButton.OnClientClick = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView, argument) + "; return false;";
        }
    }
}
0 голосов
/ 02 октября 2009

Вы должны предоставить изображение для кнопок ImageButtons. В противном случае визуализированный HTML-код выдаст тег <img src="">, а при его визуализации он вызовет обратную передачу. Попробуй.

0 голосов
/ 02 октября 2009

Попробуйте, (я не знаю, почему вы использовали javascript):

bttnrempag.onclick += bttnrempag_Click; 

protected void bttnrempag_Click(object sender, EventArgs e)
{
    //handle the removal of paging or whatever.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...