У меня была идея зарегистрировать событие на базовой настраиваемой странице для каждой кнопки. Я могу проверить, было ли это сохранение или редактирование, а затем выполнить авторизацию и проверку. Производные страницы по-прежнему будут обрабатывать событие щелчка, чтобы выполнить специфику для сохранения на этой странице. Я не был уверен, какие события произойдут раньше. (но, вероятно, это в порядке подключения). Если родительская страница запускается первой, я могу получить ожидаемое поведение, установив свойство IsAuthorized или IsValidated и проверив это в обработчике кликов каждой производной страницы.
В любом случае, есть ли способ гарантировать, что обработчик событий базовой страницы запускается и завершается первым, или есть ли способ спасти это?
РЕДАКТИРОВАТЬ: Я упускаю из виду более простой дизайн, который не требует добавления стандартного кода для каждой кнопки редактирования / сохранения / обновления в приложении? И как правильно общаться между организаторами мероприятий? Например, базовая страница должна сообщать об успешной или неудачной проверке, производный класс должен сообщать об успехе или неудаче сохранения, чтобы его можно было записать в аудите.
//Base page-- seems like this will work if events happen in order of wireup.
protected override void OnInit(EventArgs e)
{
foreach (Control possibleButton in Controls)
{
if(possibleButton is Button)
{
Button button = (Button) possibleButton;
button.Command += ButtonCommandPreconditions;
}
}
base.OnInit(e);
foreach (Control possibleButton in Controls)
{
if(possibleButton is Button)
{
Button button = (Button) possibleButton;
button.Command += ButtonCommandPostconditions;
}
}
}
void ButtonCommandPreconditions(object sender, CommandEventArgs e)
{
if(e.CommandName=="Save" || e.CommandName=="Edit")
{
//Stuff that needs to happen before other handler
//Validate, display failures-- maybe set IsValdated property
//Check for POST/GET, throw exception on GET.
//Check for ID, throw exception on anonymous user
//Check for authorization
//Display authorization failures-- maybe set IsAuthorized property
}
}
void ButtonCommandPostconditions(object sender, CommandEventArgs e)
{
if(e.CommandName=="Save" || e.CommandName=="Edit")
{
//Stuff that needs to happen *after* other handler
//Log save
}
}
Изменить: измененный код, чтобы отразить, что обработчики событий должны обрабатываться в порядке подключения.