#javascript #asp.net #webforms #postback #dopostback
Вопрос:
Я протестировал кнопки внутри ретранслятора на панели обновления. Если вы добавляете asyncpostback <Trigger></Trigger>
для кнопок, вы получаете сообщение об ошибке. Кнопку найти не удалось.
Ну, я использую две кнопки связи внутри ретранслятора. я добавил код javascript OnClick="__doPostback(linkbutton1, '');"
, чтобы он работал без полной обратной связи. Кнопка нажимается, и я показываю сообщение.
Это работает без проблем. Не сталкиваюсь с проблемой полной обратной связи.
<asp:LinkButton runat="server" ID="linkbutton" OnClientClick="__doPostback(linkbutton1.UniqueID, '');" />
Я просто хочу использовать функцию, а не прямой код внутри 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);
Ответ №1:
Вы используете return postback() в onclient click, но эта процедура должна возвращать значение true или false. Если верно, то происходит код кнопки на стороне сервера и «частичная» обратная отправка.
Помните, самолет Джейн стандарт 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);
}
Итак, мы видим это:
И, нажав на эту кнопку, мы получим это:
Окно вывода:
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, подпрограмму «всплывающее сообщение»?
Эти процедуры НЕ ждут, и вам придется немного изменить этот код, так как он работает асинхронно, и большинство диалоговых окон и окон сообщений jquery НЕ ждут, и, следовательно, вы не можете условно запрашивать пользователя таким образом (я могу опубликовать, как вы можете это сделать, если хотите).
Итак, неясно, хотите ли вы просто зайти, используйте стандартный asp.net кнопка, но ТОЛЬКО код вызова на стороне клиента?
Как уже отмечалось, затем убедитесь, что выражение возвращает значение false. или, как уже отмечалось, используйте:
OnClientClick="postback();return false;"
Я