Я думаю о коде 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.В этом методе создается целое дерево управления для страницы.
Награда за ваши ценные комментарии.:)