Вопрос о ASP.NET-коде за моделью - PullRequest
0 голосов
/ 14 декабря 2010

Я думаю о коде asp.net 2.0, лежащем в основе модели.

После того, как я перетащил кнопку на свою страницу Default.aspx , я получил следующее объявление в моей Default.aspx.designer.cs file:

public partial class _Default {

    protected global::System.Web.UI.HtmlControls.HtmlForm form1;

    protected global::System.Web.UI.WebControls.Button Button1;
}

И теперь я могу написать следующий код в Default.aspx.cs file:

protected void Button1_Click(object sender, EventArgs e)
{
    Button1.Text = "clicked!";
}

Но мне интересно, что я получил - это не что иное, как объявление переменной Button1 типа Button, не было экземпляра , как этот код мог работать безсрабатывание Null Reference Exception ?

Я думаю, что где-то должен существовать такой код:

Button1 = new Button();

Но где этот код?Когда выполняется этот код?Кто его выполняет?

Большое спасибо ...

Обновление - 1 - 21:17 12/15/2010

Я нашел 2 автоматически сгенерированных файла в таинственном месте C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Временные файлы ASP.NET \ root \ edd9f4a1 \ 7f113408 , это:

App_Web_x_swwj6s.1.cs
App_Web_x_swwj6s.0.cs

Я нашел код, подобный приведенному нижев файле App_Web_x_swwj6s.0.cs:

        private global::System.Web.UI.WebControls.Button @__BuildControlButton1()
         {
            global::System.Web.UI.WebControls.Button @__ctrl;                
            @__ctrl = new global::System.Web.UI.WebControls.Button();
            //....
            this.Button1 = @__ctrl;
            return @__ctrl;
          }

И этот метод вызывается в следующем коде:

private global::System.Web.UI.HtmlControls.HtmlForm @__BuildControlform1()
{
  //....
  global::System.Web.UI.WebControls.Button @__ctrl1;

  @__ctrl1 = this.@__BuildControlButton1();
  //......
}

И, наконец, приведенный выше код вызывается в следующем методе:

protected override void FrameworkInitialize()

Поэтому я полагал, что метод FrameworkInitialize () - это тот, кто сделал грязную работу по привязке элемента управления ссылка к экземпляру элемента управления .

Чтобы доказать это, я намеренно написал следующий код в своем файле с выделенным кодом:

protected override void FrameworkInitialize()
{
    this.Button1 = null;
}

Я надеюсь, что при нажатии кнопки будет исключение Null Reference,но как ни странно, весь сайт работает без сбоев.

Правда ли, что все элементы управления, которые я объявил в файле aspx, создаются с помощью метода FrameworkInitialize ()?Почему в приведенном выше сценарии нет нулевого ссылочного исключения?

Еще раз большое спасибо.

Обновление - 2 - 21:43 12/15 / 2010

Я думаю, что могу найтиобъяснение, я проверил окончательный класс страницы, сгенерированный ASP.NET с .NET рефлектором.Его производное отношение выглядит следующим образом:

default_aspx class (конечный класс, представляющий страницу) <--- <strong>_Default class (код класса) <-- System.Web.UI.Page </p>

И в классе default_aspx я обнаружил следующее:

protected override void FrameworkInitialize()
{
    base.FrameworkInitialize();  // Button1=null is executed here.
    this.__BuildControlTree(this); // Here Button1 is STILL set to an instance.
    base.AddWrappedFileDependencies(__fileDependencies);
    base.Request.ValidateInput();
}

Итак, это может объяснить, почему мое намерение установить Button1 в ноль не удалось.

Теперь мой вопрос: должен ли метод FrameworkInitialize () вызываться в самом начале жизненного цикла страницы, чтобы впоследствии мы могли использовать элемент управления на странице.

Обновление - 3 - 15:45 12/16/2010

С здесь :

Как только класс обработчика страниц HTTP полностью идентифицированво время выполнения ASP.NET вызывает метод ProcessRequest обработчика для обработки запроса.Обычно нет необходимости менять реализацию метода, как это предусмотрено классом Page.

Эта реализация начинается с вызова метода FrameworkInitialize, который создает дерево элементов управления для страницы.Метод является защищенным и виртуальным членом класса TemplateControl - класса, из которого происходит сама страница Page.Любой динамически генерируемый обработчик для ресурса .aspx переопределяет FrameworkInitialize.В этом методе создается целое дерево управления для страницы.

Награда за ваши ценные комментарии.:)

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

Так что именно вы хотите получить ответы сейчас ... для меня это выглядит так, как будто вы отвечаете на большинство своих вопросов сами?:)

Что касается FrameworkInitialize, то проще всего, если вы запустите Reflector и посмотрите на код.Кодекс это закон!:) Здесь вы увидите, что System.Web.UI.TemplateControl.FrameworkInitialize() вызовет внутренний метод с именем System.Web.Compilation.BuildResultNoCompileTemplateControlFrameworkInitialize(TemplateControl), который выполняет фактическую инициализацию вашего дерева управления.Это означает, что переопределение FrameworkInitialize() и установка для Button1 значения null не окажут никакого влияния, поскольку этот код будет выполняться ДО ТОГО, как дерево управления будет инициализировано.

3 голосов
/ 14 декабря 2010

Страница и ее элементы управления (включая вашу кнопку в данном случае) создаются "механизмом просмотра" веб-форм до запуска событий OnLoad и т. Д.

В противном случае вам понадобится фильтр ISAPI или аналогичные запросы на перехват устройства и создайте объект страницы и его элементы управления до того, как произойдет любое событие .Это то, что делает DLL ASP.NET ISAPI, я думаю.

Я не пробовал этого, но вы можете установить точку останова в конструкторе страницы, чтобы увидеть список ::Controls[] перед чем-либосоздается, и я ожидаю, что она будет пустой (но приведенная ниже ссылка на жизненный цикл страницы будет иметь лучшее объяснение).

См. эту ссылку или эту.

...