簡體   English   中英

在轉發器中使用按鈕 onclick 事件上的 javascript 導致更新面板中的完整回發

[英]using javascript on button onclick event in repeater causing full postback in updatepanel

我已經測試了更新面板中中繼器內的按鈕。 如果您為按鈕添加 asyncpostback <Trigger></Trigger> ,則會出現錯誤。 找不到按鈕。

好吧,我在中繼器內使用了兩個鏈接按鈕。 我在OnClick="__doPostback(linkbutton1, '');"上添加了 javascript 代碼它在沒有完整回發的情況下工作。 按鈕正在點擊,我正在顯示消息。

它工作沒有問題。 不面臨 FullPostBack 問題。

<asp:LinkButton runat="server" ID="linkbutton" OnClientClick="__doPostback(linkbutton1.UniqueID, '');" />

我只想使用 function 而不是直接在 OnClick 中編碼,問題已經開始。

例子:

function postback(){
__doPostback(linkbutton1.UniqueID, '');
}

ASP.NET 代碼:

<asp:UpdatePanel ID="update_buttons" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
    <ContentTemplate>
      <asp:Repeater  ID="repeaterb" runat="server">
        <ItemTemplate>
          <asp:LinkButton runat="server" ID="linkbutton" OnClientClick="return postback();" />
          <asp:LinkButton runat="server" ID="linkbutton1" OnClick="linkbutton1_Click"/>
        </ItemTemplate>
      </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

代碼隱藏:

Page.ClientScript.RegisterStartupScript(this.GetType(), "postback", "postback()", true);

您在 onclient click 中使用 return postback(),但該例程必須返回 true 或 false。 如果為真,則發生服務器端按鈕代碼和“部分”回發。

請記住,更新面板中的 plane jane standard asp.net 按鈕確實會導致我們稱之為部分回發(甚至觸發頁面加載事件)。 所以,我沒有看到使用服務器端 asp.net 按鈕和使用 OnClientClick 之間有什么特別的區別,它也執行回發!!! - 他們都應該做同樣的事情!

請注意通過注入客戶端腳本確定有關運行客戶端腳本的代碼行(注冊腳本 - 不確定與此問題有什么關系?(有點令人困惑)。您可以通過一個按鈕同時運行客戶端代碼和服務器如下所示,側代碼合並為一個按鈕。

因此,對於 OnClientClick 按鈕,您可以/可以這樣做:

<asp:LinkButton runat="server" ID="linkbutton" OnClientClick="postback();return false;" />

因此,如果 OnClientClick 返回 true - 那么更新面板回發將會發生。

如果 OnClientClick 返回 false - 將不會發生更新面板回發。

因此,讓我們放入一個測試按鈕,並運行一些服務器端代碼:

所以,我們現在有這個:

  <asp:UpdatePanel ID="update_buttons" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
    <ContentTemplate>
      <asp:Repeater  ID="repeaterb" runat="server">
        <ItemTemplate>

          <asp:TextBox ID="HotelName" runat="server" Text = '<%# Eval("HotelName") %>' ></asp:TextBox>
            <br />
          <asp:LinkButton runat="server" ID="linkbutton" OnClientClick="return postback();" Text="Link button"/>
            <br />
          <asp:LinkButton runat="server" ID="linkbutton1" OnClick="linkbutton1_Click" Text="Link btn 1" />
            <br />

            <asp:Button ID="Button1" runat="server" Text="Server Test button"
                onclick="Button1_Click"/>
            <div style="clear:both;height:15px"></div>
        </ItemTemplate>
      </asp:Repeater>
    </ContentTemplate>
  </asp:UpdatePanel>

所以按鈕點擊服務器端代碼可能是這樣的:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadMyRepeater();
    }

    void LoadMyRepeater()
    {
        using (SqlCommand cmdSQL = new SqlCommand("SELECT * from tblHotels WHERE ID = 23",
                                  new SqlConnection(Properties.Settings.Default.TEST3)))
        {
            cmdSQL.Connection.Open();
            repeaterb.DataSource = cmdSQL.ExecuteReader();
            repeaterb.DataBind();
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Button MyButton = (Button)sender;
        RepeaterItem rRow = (RepeaterItem)MyButton.Parent;

        Debug.WriteLine("Row click Index = " + rRow.ItemIndex.ToString());
        Debug.WriteLine("Hotel Name = " + ((TextBox)rRow.FindControl("HotelName")).Text);

    }

所以我們看到這個:

在此處輸入圖像描述

然后點擊那個按鈕,我們得到這個:

Output window:

Row click Index = 0
Hotel Name = Ramada Lodge

現在,我們可以向那個簡單的按鈕添加一個單擊代碼存根。 因此,我們可以為單擊一個按鈕同時運行客戶端代碼和服務器端代碼。

我們甚至可以通過運行 OnClientClick 代碼來有條件地運行該按鈕代碼。

按鈕可以變成這樣:

      <asp:Button ID="Button1" runat="server" Text="Server Test button"
                onclick="Button1_Click"
                OnClientClick="return myprompt();"/>

  <script>
        function myprompt() {
            return confirm("Do you really want to run server code?");

        }
    </script>

然后當你點擊那個按鈕時,你會得到這個:

在此處輸入圖像描述

所以,現在如果你點擊確定,按鈕的服務器端代碼就會運行,但是如果你點擊取消,那么服務器端代碼按鈕就不會運行。

但是,請注意提示。 如果您使用 jQuery 對話框,toast 消息例程?

這些例程不會等待,並且您必須稍微更改該代碼,因為它運行異步,並且大多數 jquery 對話框和消息框不會等待,因此您不能以這種方式有條件地提示用戶(我可以發布您的方式如果您願意,可以這樣做)。

所以,不清楚你是否只是想加入,+使用標准的 asp.net 按鈕,但只調用客戶端代碼?

如前所述,然后確保表達式返回 false。 或者如前所述,使用:

 OnClientClick="postback();return false;"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM