Конференция ".Net" » Как конкретно подключается обработчик Page_Load в ASP.NET? [C#]
 
  • kaif © (30.10.07 11:42) [0]
    Если создать страницу в ASP.NET, то создается такой шаблон:
    public partial class _Default: System.Web.UI.Page
    {
     protected void Page_Load(object sender, EventArgs e)
     {
     }
    }

    Ясен пень, что метод Page_Load вызывается, когда возникает соотвествующее событие.
    Однако я так и не смог пока найти то место, где имя метода "Page_Load" назаначается событию Load.

     Если мой вопрос непонятен, поставьте на форму кнопку Button1 и дважды щелкните на ней. Вы увидите, как в класс _Default вставится метод Button1_Click и это имя будет назначено компоненту Button1 в виде значения свойства (атрибута) OnClick, что можно увидеть как в тэге этого серверного компонента. так и в инспекторе свойств. Причем если это значение свойства (атрибута) изменить в инспекторе свойств на AnyButtonClick, то Visual Studio переименует и сам метод в тексте класса _Default.

     Однако у самой формы или страницы нет атрибута OnLoad, которому что-либо назначалось бы. Так как же класс узнает, какой обработчик подключить на это событие? Допустим я хочу добавить обработчик на событие Render формы. Все пишут, что это так же легкол сделать, как подключить обработчик Page_Load. Но никто не пишет, как конкретно это сделать.
     Я что, должен назвать метод именем Page_Render или Page_Init  и надеяться, что ASP.NET это как-то таинственным образом сама поймет ?
  • clickmaker © (30.10.07 12:21) [1]
    private void InitializeComponent()
    {    
     this.Load += new System.EventHandler(this.Page_Load);
    }
  • kaif © (30.10.07 15:52) [2]
    2 clickmaker ©   (30.10.07 12:21) [1]
    Спасибо.
  • b z (30.10.07 18:36) [3]
    для FW 2 см. AutoEventWireup
  • kaif © (31.10.07 10:54) [4]
    Вот секция из System.web.xml:

    <member name="P:System.Web.Configuration.PagesSection.AutoEventWireup">
      <summary>Gets or sets a value indicating whether events for ASP.NET pages are automatically connected to event-handling functions.</summary>
      <returns>true if events for ASP.NET pages are automatically connected to event-handling functions; otherwise, false. The default is false.</returns>
     </member>



    Получает или устанавливает значение, говорящее о том, что страницы ASP.NET автоматически подключаются к функциям-обработчикам событий.
    По умолчанию - false.

    Программно это свойство можно установить видимо так:

    System.Web.Configuration.PageSection.AutoEventWireup = true;

    Однако об именовании событий никакого соглашения я пока не нашел. Так что как обработчики событий подключаются к самим событиям, я пока не вижу.
    То есть я пока не вижу никакого назначения метода Page_Load событию Load в самой системе ASP.NET.
  • b z (31.10.07 11:09) [5]
  • b z (31.10.07 11:12) [6]
    вот только-что созданная страница
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Web._Default" %>
  • kaif © (31.10.07 11:15) [7]
    В литературе описаны следующие примеры назначения событий:
    Добавить обработчик с именем Page_Error прямо в Default.aspx.cs. Или же можно создать файл Global.ascx и там создать кучу обработчиков, например: Application_Start, Application_Error и т.д.

    Однако, где эти обработчики подключаются в той манере, что описал clickmaker ©   (30.10.07 12:21) [1], я не могу нати.

    Пока что для меня это некие заклинания, которые система ASP.NET как-то понимает, но как - я не знаю.

    Для эксперимента я только что переименовал метод Page_Load в  Page_Load33. При компиляции - никаких ошибок. Запустил трассировку. Событие Load отрабатывается (вижу сообщения Begin Load и End Load), однако мой обработчик попросту перестал вызываться (у меня в нем прописано Trace.Warn("PageLoad");)
  • kaif © (31.10.07 11:22) [8]
    2 b z   (31.10.07 11:09) [5]

    Все, спасибо! В приведенной Вами ссылке я нашел ответ на свой вопрос. Действительно, связывание событий с методами происходит на основе соглашения об именовании, если AutoEventWireup = true.

    Binding Page Events

    ASP.NET pages raise life-cycle events such as Init, Load, PreRender, and others. By default, you can bind page events to methods using a naming convention of Page_eventname. For example, to create a handler for the page's Load event, you can create a method named Page_Load. At compilation time, ASP.NET will find methods based on this naming convention and automatically perform the binding between the event and the method. You can use the convention of Page_eventname for any event exposed by the Page class.

    Note  
    Page event-handling methods do not require any arguments.


    If you prefer, you can create handlers explicitly. The automatic binding of page events based on the method naming convention is controlled by a page property named AutoEventWireup. By default, this property is set to true, and ASP.NET performs the automatic lookup and binding described earlier. Alternatively, you can set this property to false by adding the attribute AutoEventWireup=false in the @ Page directive. You can then create methods with any name and bind them to page events explicitly. In Visual Basic, you can use the Handles keyword, as in the following code example:

    Visual Basic Copy Code
    Sub MyPageLoad(sender As Object, e As EventArgs) Handles MyBase.Load

    The disadvantage of the AutoEventWireup attribute is that it requires that the page event handlers have specific, predictable names. This limits your flexibility in how you name your event handlers.

    Note  
    If you include explicit binding for page events, be sure that the AutoEventWireup property is set to false so that the method is not inadvertently called twice.
  • -1' (23.10.12 11:43) [9]
    1
 
Конференция ".Net" » Как конкретно подключается обработчик Page_Load в ASP.NET? [C#]
Есть новые Нет новых   [134427   +26][b:0][p:0.001]