Как проверить, какая ссылка LinkButton нажата в asp.net на странице загрузки - PullRequest
1 голос
/ 24 августа 2010

Как проверить, на каком LinkButton нажата кнопка Page_Load на странице. Это делается для того, чтобы избежать обращений к службе, чтобы она выполняла только то, что присутствует в ее событии

Ответы [ 6 ]

7 голосов
/ 24 августа 2010

Единственное, что должно быть запущено в вашем Page_Load, - это код, который вы хотите выполнять всегда при каждом запросе, ИЛИ иметь код, который вы хотите запускать только один раз, завернутый в проверку после возврата. Например:

protected void Page_Load(object sender, EventArgs e)
{
    // Put the all code you need to run with EVERY request here

    // Then add a post back check for any code you want to ONLY run on the very
    // first request to the page.
    if (!IsPostBack)
    {
        // Code you only want to run the first time.  Usually setup code to initalize
        // DropDownLists, Grids or pre populate a form, etc...
    }
}

Ваш LinkButton код должен быть полностью сам по себе в обработчике кликов:

protected void yourLinkButton_Click(object sender, EventArgs e)
{
    // code you want to execute when your button is clicked.  This will run AFTER
    // the Page_Load has finished.
}

Теперь, если ваш LinkButton используется в GridView, Repeater или некотором типе элемента управления, который требует связывания, чтобы заполнить его, то вам, вероятно, потребуется реализовать обработчик события RowCommand, чтобы выяснить, какой LinkButton нажата. Вы также можете привязать данные к его свойству CommandArgument, чтобы передать некоторые уникальные данные, специфичные для строки, в четный обработчик.

Если у вас есть куча LinkButton с использованием одного и того же обработчика, в худшем случае будет приведено sender и сравнение значений ID.

protected void yourLinkButton_Click(object sender, EventArgs e)
{
    LinkButton btn = (LinkButton)(sender);
    if (btn.ID.Equals("Some control name you want to compare"))
    {
        // do something
    }
}

Если я не в курсе вашего вопроса, просто оставьте комментарий, и я постараюсь разобраться с ним.

РЕДАКТИРОВАТЬ: На основании вашего комментария кажется, что вы должны знать, какой Button он находится в Page_Load из-за некоторых других ограничений. Ну, нет чистого способа сделать это в Page_Load, но это можно сделать. Вам нужно будет проверить клавиши Request.Form и проверить определенное имя кнопки (только клавиши Button, которые были нажаты, должны быть включены в клавиши). Например:

if (Request.Form.AllKeys.Contains("yourButton1"))
{
    // then do something based on yourButton1
}
else if (Request.Form.AllKeys.Contains("yourButton2"))
{
    // then do something based on yourButton2
}
// etc...

Я не думаю, что есть какой-то другой чистый способ обойти это. Было бы неплохо, если бы фреймворк включал элемент управления, вызвавший обратную передачу, в одном из свойств sender.

Другое Править: Это полностью ускользнуло от меня. Приведенное выше редактирование было необходимо сделать для Button, так как он не заполняет __EVENTTARGET. Так как вы используете LinkButton, вы можете использовать следующее, чтобы получить контроль, вызвавший возвращение сообщения:

string controlNameThatCausedPostBack = Request.Form["__EVENTTARGET"];

Я проверил это с LinkButton, и оно работает как положено.

Надеюсь, что наконец решит вашу проблему:)

1 голос
/ 18 мая 2012
protected void Page_Load(object sender, EventArgs e)
{
  if (IsPostBack && Request.Form["__EVENTTARGET"] == LinkButton1.UniqueID) 
  {
    // LinkButton1 was clicked
  }
}
1 голос
/ 24 августа 2010

Раньше я делал это, потому что в обработчике событий было слишком поздно. Вы можете использовать JavaScript, чтобы написать идентификатор кнопки, которая была нажата в скрытом поле. Чем вы можете получить его в Page_Load. Другой способ - заглянуть в скрытое поле _EVENTTARGET, если я правильно помню, это было давно.

0 голосов
/ 24 августа 2010

Отдельные обработчики - вот путь, но вы можете дать каждой кнопке уникальное свойство ItemCommand, отфильтровывая их при необходимости.

0 голосов
/ 24 августа 2010

Вы также можете объявить переменную типа LinkButton (или Control, или что-то еще) и заставить кнопку (и) обновить ее со ссылкой на себя в событии click, а затем проверить значение в Load.

0 голосов
/ 24 августа 2010

Вы имеете в виду, что вы просто пытаетесь предотвратить выполнение кода Page_Load при запуске других событий обратной передачи на странице? Если это так, оберните это в:

if (!IsPostBack)

(ИМХО, это что-то вроде взлома, вызванного моделью событий WebForms, но это то, что есть.)

Или я неправильно понял ваш вопрос?

Что касается идентификации определенного LinkButton, вы можете использовать параметр CommandName:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.linkbutton.commandname.aspx

...