我有一个非常好的aspx页面
它由aspx中的一些简单控件组成 - 需要动态设置它们的值 aspx中的一些用户控件需要传递给它们的一些数据 通过转发器动态添加的几个用户控件 以及需要动态创建的用户控件中的一些控件
它设置了pre_init事件中的大部分工作 - 这样我就可以在页面和用户控件中创建动态控件,这样它们就可以保持它们的视图状态。
因此:
Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
paxID = Integer.Parse(Request.QueryString("g"))
pax = New Pax(paxID)
If Not IsPostBack Then
ddlTitle.SelectedValue = pax.Title
txtFirstname.Text = pax.FirstName
txtSurname.Text = pax.Surname
ddlGender.SelectedValue = pax.Gender.ToUpper()
If (pax.DOB IsNot Nothing) Then
txtDOB.Text = CType(pax.DOB, DateTime).ToString("dd/MM/yyyy")
End If
txtNationality.Text = pax.Nationality
txtPassportNumber.Text = pax.PassportNumber
If pax.Discount IsNot Nothing Then
txtDiscount.Text = Math.Abs(pax.Discount.Price).ToString()
End If
End If
LoadPaxData()
RenderPageControls()
End Sub
Protected Sub RenderPageControls()
''work out how many weeks we are dealing with
Dim weeks = Math.Floor(bk.nights / 7)
If bk.nights Mod 7 <> 0 Then
weeks += 1
End If
''grab ALL the AVAILABILITY options for ALL weeks
For ii = 1 To weeks
Dim dt = DateAdd(DateInterval.Day, (ii - 1) * 7, theDate)
allMHOptions.AddRange(AvailabilityOptionFactory.GetMainHolidayOptionAvailability(dt))
allTravelOptions.AddRange(AvailabilityOptionFactory.GetTravelOptionAvailability(dt))
allOptions.AddRange(AvailabilityOptionFactory.GetOptionAvailability(dt))
Next
allExtras = AvailabilityOptionFactory.GetExtrasAvailability(theDate)
''now all the booked options
allBooked = Booked.BookedOptionFactory.LoadBookedOptions(pax.id)
Dim tabContent = New Dictionary(Of String, Integer)
''WEEK tabs
For i = 1 To weeks
tabContent.Add(String.Format(divIdFormat, i.ToString()), i)
Next
''bind the repeaters with the week data
rptULTabs.DataSource = tabContent
rptULTabs.DataBind()
rptTabs.DataSource = tabContent
rptTabs.DataBind()
''EXTRAS tab
ucExtras.extraOptions = allExtras
ucExtras.alreadyBooked = allBooked
''SUPPLEMENTS tab
ucSupplements.p = pax
''TRAVEL tab
ucTravel.travelOptions = allTravelOptions
ucTravel.alreadyBooked = Booked.BookedOptionFactory.LoadTravelOptions(pax.RecNum, Nothing)
ucTravel.outboundWeekStart = theDate
ucTravel.returnWeekStart = DateAdd(DateInterval.Day, (weeks - 1) * 7, theDate)
ucTravel.returnDate = depDate
End Sub
loadpaxdetails将一些额外的细节加载到pax对象
在RenderPageControls中,它抓取用户控件的位,这些又可以添加一些动态控件,并在这些或任何静态控件上设置任何数据。
ASPX ..
<div id="divTabs" runat="server">
<ul id="ulTabs">
<asp:Repeater runat="server" ID="rptULTabs">
<ItemTemplate>
<li><a href="#<%# DataBinder.Eval(Container.DataItem, "Key") %>">Week
<%#DataBinder.Eval(Container.DataItem, "Value")%>
</a></li>
</ItemTemplate>
</asp:Repeater>
<li><a href="#tabExtras">Extras</a></li>
<li><a href="#tabRequirements">Requirements</a></li>
<li><a href="#tabTravel">Travel</a></li>
</ul>
<asp:Repeater runat="server" ID="rptTabs">
<ItemTemplate>
<div id="<%# DataBinder.Eval(Container.DataItem, "Key") %>">
<uc:WeekTab runat="server" ID="ucWeekTab" EnableViewState="true" />
</div>
</ItemTemplate>
</asp:Repeater>
<div id="tabExtras">
<uc:ExtrasTab runat="server" ID="ucExtras" EnableViewState="true" />
</div>
<div id="tabRequirements">
<uc:SupplementsTab runat="server" ID="ucSupplements" EnableViewState="true" />
</div>
<div id="tabTravel">
<uc:TravelTab runat="server" ID="ucTravel" EnableViewState="true" />
</div>
</div>
现在这一切都正常,直到我决定将aspx放入母版页。
现在发生的事情是aspx中的静态控件似乎没有及时为pre_init创建,因此在尝试设置它们时会出现问题。 除此之外,我无法将用户控件添加到转发器,因为此时也没有设置
我很清楚这是一个生命周期问题,但是不明白如何简单地在主页中包装东西可以完全搞砸所有事件。 我不能简单地将renderpagecontrols调用放在页面加载中,因为这不会神奇地将UC设置回pre_init,因此使用viewstate来获取它们。?
有人可以开导我吗?
感谢
NAT
答案 0 :(得分:1)
PreInit
不是一个好地方,因为在此阶段并不能保证启动所有控件。事实上,当页面有主人时,它们不会启动。这是因为PreInit
是孔生命周期中唯一可以动态更改母版页的地方,当然,没有设置母版页的ASP.NET引擎无法完全构造控件树。
这里最好的建议是将您的逻辑移到Page_Init
和Page_Load
处理程序中。例如,所有属性设置和动态控件插入(我假设这是方法RenderPageControls
所做的) - 实际上所有你可以调用初始化应该放在Page_Init
中。数据加载(可能是LoadPaxData
的调用)应该在Page_Load
内完成。有关在页面生命周期的哪个阶段推荐的操作的更多信息,请here。
但是,如果您严重想要在Page_PreInit
中运行所有代码(虽然我在代码段中看不到任何理由) - 但有一种解决方法。在处理程序的开头插入以下行:
MasterPage master = this.Master;
这将使异常消失。这个技巧的作用是因为调用Master
属性会触发主页面的创建,其中包括为所有asp:Content
控件生成内容。但仍然 - 这只是一般信息,绝对不是推荐的方式。