класс aspx.cs, расширяющий a .cs: почему я не могу получить это значение с помощью конструктора?

#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 главной страницы, но загрузка будет выполнена после