Организация методов обработчиков событий

Я использую asp.net и C # в веб-формах.

Используя Visual Studio, он автоматически создает методы обработчиков событий для моих элементов управления. VS генерирует имя метода таким образом idControl_event. Я знаю, что могу дать любое имя методам обработчиков событий.

  • Так что мне интересно, какой ваш любимый подход к названию темы.

  • Я хотел бы знать, можно ли с помощью веб-форм написать метод обработчиков событий в отдельном классе (а не в коде для конкретной веб-страницы) и как вызвать тему из элемента управления.

Спасибо за ваше время.


person GibboK    schedule 13.07.2011    source источник
comment
Просто из любопытства, зачем вам отделить обработчики событий от кода программной части?   -  person Tim    schedule 13.07.2011
comment
Я читал об этом архитектурном подходе в книге «Объекты C # 2008», называемой шаблоном, который можно использовать в приложениях Windows. Основная идея состоит в том, чтобы иметь общую логику в одном месте для многих элементов управления ... поэтому мне было интересно посмотреть, можно ли ее применить даже в веб-формах.   -  person GibboK    schedule 13.07.2011
comment
Хм, это дало мне еще одну идею об использовании базового класса для инкапсуляции общей логики - я обновил свой ответ, включив и эту опцию.   -  person Stephen McDaniel    schedule 13.07.2011


Ответы (3)


Для имен обработчиков событий я обычно использую формат, который Visual Studio генерирует по умолчанию: [idControl] _ [eventName]. Но это во многом личное / командное предпочтение. Я видел подобные обсуждения по этому поводу, такие как этот или этот. Независимо от того, как вы решите называть обработчики событий, я думаю, что самое важное - оставаться последовательными.

Что касается наличия обработчиков событий вне вашего кода, я не видел, чтобы это делалось очень часто, но это возможно. Самый простой способ - иметь статический метод в отдельном классе с общей логикой обработки событий. Например, вот как у вас может быть стандартная логика для Page.Loaded в отдельном классе. Я считаю, что вам нужно зарегистрировать обработчик событий с помощью кода - я не думаю, что вы можете сделать это в разметке (aspx).

public static class CommonEventHandlers
{
    public static void Page_Loaded(object sender, EventArgs e)
    {
        //Do any standard logic

        //If you need a reference to the page that raised the event, 
        //   you can get it from the 'sender' parameter.
        Page page = (Page)sender;

        //Do something with 'page'
    }
}

Затем в коде программной части страницы, на которой вы хотите использовать этот общий обработчик событий:

public partial class WebForm1 : System.Web.UI.Page
{
    public WebForm1()
    {
        //Register the handler via code in the constructor
        Load += CommonEventHandlers.Page_Loaded;
    }
}

В качестве другого варианта вы можете использовать наследование, чтобы помочь с повторным использованием кода. Например, у вас может быть базовый класс, от которого наследуются ваши страницы, со стандартными обработчиками. Одним из преимуществ этого является то, что вы можете регистрировать обработчики событий в разметке, даже если метод объявлен в базовом классе, поэтому вам не нужно ничего делать в коде программной части страницы-предка.

person Stephen McDaniel    schedule 13.07.2011
comment
нужно ли OP также установить AutoEventWireup в false, чтобы использовать это? - person Tim; 13.07.2011
comment
@Tim - AutoEventWireup не повлияет на этот подход. Однако, если у вас есть метод с именем Page_Load на странице, а AutoEventWireup был true, будут вызываться оба Page_Load метода и из CommonEventHandler. Но я думаю, что этого следовало ожидать - и, возможно, даже желательно, если вы хотели, чтобы произошла некоторая стандартная обработка (в CommonEventHandlers) и пользовательская обработка (в Page_Load). - person Stephen McDaniel; 13.07.2011
comment
Интересный. Если бы порядок, в котором запускались события, всегда был известен и гарантированно был одинаковым (то есть код программной части, а затем CommonEventHandlers), это могло бы привести к некоторым интересным возможностям дизайна. Хотя я до сих пор не уверен, что подходов лучше не найти. - person Tim; 13.07.2011
comment
дополнительные объяснения AutoEventWireup можно найти здесь forum.asp.net/p/932513/1096656 .aspx - person GibboK; 13.07.2011
comment
Теоретически я не верю, что порядок гарантирован. Но на практике обработчики событий вызываются в том порядке, в котором они были зарегистрированы (только не цитируйте меня по этому поводу). Итак, в приведенном выше случае сначала будет вызываться CommonEventHandler (он регистрируется в конструкторе, что намного раньше, чем когда происходит AutoEventWireup). В любом случае, я согласен с тем, что наличие нескольких обработчиков событий, зависящих от определенного порядка, - плохой знак. - person Stephen McDaniel; 13.07.2011
comment
Спасибо, Стивен, я понимаю, что вы говорите об использовании базового класса .. какие будут плюсы и минусы или оба ваших подхода? - person GibboK; 13.07.2011
comment
Единственным недостатком использования базового класса является то, что C # не имеет множественного наследования (что, вероятно, хорошо, но это уже другая история). Так, например, если у вас есть общий код, который вы хотите использовать, и поместите его в BasePage, как в моем примере, это нормально, если вы просто делитесь кодом на других страницах. Но тогда, если вы хотите создать элемент управления, вы больше не сможете использовать BasePage в качестве базового класса. Но помимо этого ограничения, я думаю, что проще использовать базовые классы, и это просто «кажется» правильным :-). - person Stephen McDaniel; 14.07.2011

Я не думаю, что у вас могут быть обработчики событий в другом классе, лучшее, что вы могли бы получить, вероятно, было бы внутри отдельного файла частичного класса

person Daniel Powell    schedule 13.07.2011

Как сказал @Daniel Powell, я почти уверен, что лучшее, что вы можете сделать с событиями, - это разместить их в другом файле в качестве частичного класса для вашего кода программной части.

Что касается соглашения об именах, в 95% случаев я вижу события, названные так, как вы сказали - idControl_event. Я так их называю, потому что это позволяет легко привязать код к элементу управления, когда я смотрю на исходный код.

person Tim    schedule 13.07.2011