Я работаю над приложением ASP.NET Web Forms
. У меня есть UpdatePanel
внутри которого у меня есть TextBox
и Button
:
<asp:UpdatePanel ID="MyID"
UpdateMode="Always"
runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnId"/>
</Triggers>
<ContentTemplate>
<asp:Label id="LblId" Text="The total value is:" runat="server" />
<asp:TextBox ID="txtId" Text="" readonly="true" runat="server"></asp:TextBox>
<asp:button id="btnId" Text="Calculate" runat="server" onclick="btnId_Click"/>
</ContentTemplate>
по моему коду у меня есть обработчик:
protected void btnId_Click(object sender, EventArgs e)
{
txtId.Text = ..
}
Проблема, которую я испытываю, заключается в том, что когда я нажимаю кнопку " Calculate
, она сначала просматривает некоторые (возможно, все события init) страницы, такие как Page_Load
которую я смог проверить с помощью отладчика, прежде чем мой btnId_Click
будет выполнен. Мой код firs прошел через:
protected void Page_Load(..)
{
...
if (Page.IsPostBack)
{
...
}
}
что неприятно, так как у меня есть какая-то логика, которую я не хочу исполнять при нажатии этой кнопки, я бы хотел, чтобы я исполнял только код внутри обработчика btnId_Click
и это все. Как можно добиться чего-то подобного?
Похоже, вы хотите избежать обратной передачи. Эта ссылка объясняет детали от Microsoft. http://msdn.microsoft.com/en-us/library/ms178208(v=vs.90).aspx
Короче говоря, вы можете отправлять сообщения в функцию WebMethod, но у них не будет доступа к коду за глобальными переменными или состоянием сеанса. Microsoft заявляет, что вы получаете доступ к вашему серверному методу без полной обратной передачи, делая это.
из документации;
Создание метода обратного вызова сервера
В коде сервера вы должны создать метод, который реализует метод RaiseCallbackEvent и метод, реализующий метод GetCallbackResult. Метод RaiseCallbackEvent принимает один строковый аргумент вместо обычных двух аргументов, которые обычно используются с обработчиками событий. Часть метода может выглядеть следующим образом:
public void RaiseCallbackEvent(String eventArgument)
{
// Processes a callback event on the server using the event
// argument from the client.
}
Вы не можете отключить это. Но вы можете проверить, какой контроль вызвал обратную передачу, а затем запустить на этой странице логику Page_Load.
Используйте этот метод:
/// <summary>
/// Retrieves the control that caused the postback.
/// </summary>
/// <param name="page"></param>
/// <returns></returns>
private Control GetControlThatCausedPostBack(Page page)
{
//initialize a control and set it to null
Control ctrl = null;
//get the event target name and find the control
string ctrlName = page.Request.Params.Get("__EVENTTARGET");
if (!String.IsNullOrEmpty(ctrlName))
ctrl = page.FindControl(ctrlName);
//return the control to the calling method
return ctrl;
}
Код из этого ответа: какой элемент управления вызвал обратную передачу?
Затем вы можете изменить свое событие Page_Load, чтобы сделать следующее:
protected void Page_Load(..)
{
if(GetControlThatCausedPostBack(this).Equals(btnId)
{
...
if (Page.IsPostBack)
{
...
}
}
}
Page_Load
которая там не принадлежит? Если страница отправлена обратно, вы должны использовать события в 99% всех случаев. Что вы делаете,if (Page.IsPostBack)
?