[英]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.