#c# #asp.net #.net
#c# #asp.net #.net
Вопрос:
У меня есть этот код :
MainPage.cs
public class MainPage : System.Web.UI.Page
{
public string myVar = "";
public MainPage()
{
}
protected override void OnPreInit(EventArgs e)
{
myVar = "Hello";
HttpContext.Current.Items["myVar"] = myVar;
base.OnPreInit(e);
}
}
public class iUserControl : System.Web.UI.UserControl
{
protected string myVar;
public iUserControl()
{
myVar = (string)HttpContext.Current.Items["myVar"];
}
}
Example.aspx
<%@ Register src="../context/master/Exz.ascx" tagname="Exz" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:Exz ID="Exz1" runat="server" />
</div>
</form>
</body>
</html>
Example.aspx.cs
public partial class interne_Example : MainPage
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("First : " myVar "<br />");
}
}
Exz.ascx.cs
public partial class context_master_Exz : iUserControl
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Second : " myVar "<br />");
}
}
Я рассматриваю это поведение :
- Я вызываю
example.aspx
; - в
OnPreInit()
нем хранитсяHttpContext
значениеmyVar
; - после этого я сначала печатаю его в Example.aspx.cs (и это работает);
- в том числе
Exz.ascx
изExample.aspx
, он также должен напечатать значение во второй раз поExz.ascx.cs
ответу.Напишите. Но он выводит пустое значение!!!!
Почему это? Я вижу, что могу решить эту проблему, отредактировав iUserControl
класс как :
public class iUserControl : System.Web.UI.UserControl
{
protected string myVar;
public iUserControl()
{
}
protected override void OnLoad(EventArgs e)
{
myVar = (string)HttpContext.Current.Items["myVar"];
base.OnLoad(e);
}
}
но я действительно не знаю, почему при загрузке это работает. Можете ли вы помочь мне решить эту проблему?
Ответ №1:
http://msdn.microsoft.com/en-us/library/ms178472.aspx
Это вопрос жизненного цикла страницы / элемента управления. В порядке, когда они срабатывают:
Главная страница.MainPage()
IUserControl.IUserControl()
Главная страница.OnPreInit()
Главная страница.OnLoad()
IUserControl.OnLoad()
Комментарии:
1. Oh…it это проблема жизненного цикла. Я думаю, я узнаю об этом больше. Я также подумал, что MainPage. MainPage() был последним методом (конструктором), который вызывался … черт 🙂
Ответ №2:
Потому что конструктор IUserControl будет выполнен до OnPreInit главной страницы, но загрузка будет выполнена после