Как выполнить только логику внутри события onclick кнопки asp.net

1

Я работаю над приложением 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 и это все. Как можно добиться чего-то подобного?

  • 0
    Так почему же вы помещаете логику в Page_Load которая там не принадлежит? Если страница отправлена обратно, вы должны использовать события в 99% всех случаев. Что вы делаете, if (Page.IsPostBack) ?
  • 0
    @TimSchmelter Вы действительно думаете, что это проблема?
Показать ещё 5 комментариев
Теги:

2 ответа

2
Лучший ответ

Похоже, вы хотите избежать обратной передачи. Эта ссылка объясняет детали от 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.
}
0

Вы не можете отключить это. Но вы можете проверить, какой контроль вызвал обратную передачу, а затем запустить на этой странице логику 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)
          {
           ...
          }
    }
}
  • 0
    Вместо этого просто используйте соответствующие обработчики событий.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню