2010-08-23 2 views
1

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

+1

Для чего это должно быть печатаемая страница? Почему бы не иметь отдельных обработчиков событий для каждой кнопки ссылки и выполнить вашу обработку в этой функции? – Tommy

+0

Выполнение загрузки страницы не связано со ссылками, – batwadi

+3

Извините, но ваше требование звучит как обходной путь для плохого дизайна. Я бы посоветовал вам прочитать о концепциях asp.net. Хорошим началом является ответ Келси. – Scordo

ответ

0

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

if (!IsPostBack) 

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

Или я недоразумение вашего вопроса ?

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

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

1

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

0

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

7

Единственное, что должно быть выполнено в вашем 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 s, использующая тот же самый обработчик, наихудший сценарий - это сделать 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 
    } 
} 

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

EDIT: Основываясь на ваш комментарии, это звучит, как вы должны знать, какие 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 и он работает, как ожидалось.

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

+0

Спасибо Келси за подробные ответы. Я бы реализовал то же самое. Проблема в моей странице: я делаю разбивку на страницы на загрузку страницы и проверяю какое-то скрытое значение поля ... Я знаю его очень плохой дизайн, но он уже был реализован, поэтому его нельзя изменить – batwadi

+0

@ prakash Я обновил свой ответ, надеюсь, включит некоторый код, который должен вас поднять и запустить. Дай мне знать, если тебе еще понадобится помощь. – Kelsey

+0

Спасибо, что предоставили свое время Келси, но проблема в том, что LinkButton не появится в параметре Request, так как в моем запросе параметров параметра id только кнопки knoledge. Пожалуйста, совет – batwadi

0

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

1
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack && Request.Form["__EVENTTARGET"] == LinkButton1.UniqueID) 
    { 
    // LinkButton1 was clicked 
    } 
} 
Смежные вопросы