在 ASPX 页面加载中从 ASCX 引发的事件加载变量,并在页面上生成动态按钮



我在aspx页面的顶部动态构建cookie屑(链接按钮)。当用户单击此页面上的其他按钮时,面包屑将被填充。每个面包屑都有一个超链接,因此用户可以单击它以返回到面包屑引用的部分。每次用户单击所有者页面上应该更新面包屑.aspx按钮时,我都会设置一个公共变量,并引用填充面包屑的子变量。我为页面加载中的每个回发调用此 sub。

我在 owner 中

还有一个 people.ascx 控件.aspx并希望在 owner 中更新/填充 cookie 面包屑.aspx当用户单击 people.ascx 中的按钮时。

为此,我正在尝试从people.ascx在所有者.aspx中引发事件。

  1. 在people.ascx中按钮的onclick子中,我用以下方式引发一个事件:RaiseEvent UpdateOwnerCookieCrumbs("2A")//请注意,在这个例子中,我传递了一个变量"2A"。
  2. 在 people.ascx 的顶部,我用 : 公共事件更新所有者登陆人民面包屑(PeopleCrumbID 作为字符串)
  3. 在 owner.aspx 的顶部,我声明了我从 people.ascx 传递的变量,其中包含:公共属性 PeopleCrumbID 作为字符串
  4. 在 owner 的页面加载中.aspx我添加一个处理程序来调用事件:AddHandler ucPeople_e.UpdateOwnerLandingPeopleCrumbs, AddressOf Me.BuildCrumbs

问题的症结在于变量从人到所有者的传递。

所有者中的 BuildCrumbs 子.aspx 是我动态构建饼干屑的地方,这些饼干屑都添加到所有者的占位符中.aspx :

我用这样的代码构建了一个按钮:

mybtn2.ID = "btnOwnerPeopleEmployees_Crumb"
mybtn2.ToolTip = "Manage my business employees"
mybtn2.Text = "Employees"
AddHandler mybtn2.Click, AddressOf OwnerLandingPeopleRedir
CookieCrumbs.Controls.Add(mybtn2)

上面按钮构建中的 OwnerLandingPeopleRedir 是一个子。因此,如果在 owner.aspx 中单击了 cookie crumb 按钮,则应调用 OwnerLandingPeopleRedir 子。

问题?

当从 people.ascx 引发在 owner.aspx 中构建 cookie 屑的请求时,会发生所有者.aspx的页面加载。页面加载调用 buildcrumbs sub(第一次),而不知道从 people.ascx 传递的 PeopleCrumbID 变量的值。然后 owner.aspx 中的事件处理程序被引发,并且再次调用 buildcrumbs sub(第 2 次),这次是 PeopleCrumbID 变量被识别。单步执行代码看起来都不错。但是,当我在 owner 中单击饼干屑按钮.aspx回发后,该按钮的超链接不会调用 OwnerLandingPeopleRedir 子。因此,当代码第二次通过构建屑运行时,超链接会丢失。

我尝试从页面初始化事件和所有其他可能的事件调用 BuildCrumbs Sub,以查看在页面生命周期的早期构建面包屑是否有帮助,但这并没有区别。

我还尝试更改我的代码以为 peoplecrumb 设置会话变量,而不是随 raiseevent 一起传递它,但这也没有用。在这种情况下,我发现如果我点击一个按钮 2 次,饼干屑就会成功构建......编程会在第一次传递时记住旧的会话变量值,并成功应用它来构建面包屑......呵呵。

有谁知道如何帮助我克服这个驼峰?请!:)

我想我看到你正在做的事情导致了你的问题。 不过,为了确定我理解...您已经生成了一个自定义控件 (.ascx),通过将其添加到占位符控件来动态添加到 Web 窗体中。 但是,当用户与自定义控件交互时,事件不会引发到父级。

我认为你在这里有一个良好的开端,但我想就一种稍微不同的方法来解决这个问题提出建议。 它还可能会稍微清理代码,并使您不必在一个页面生存期内生成控件两次。

首先,将"BuildCrumbs"子更改为以下内容(您可能需要更改"Dim mybtn2"行以匹配项目的详细信息):

Private Sub BuildCrumbs(IsNewControl As Boolean)
    Dim mybtn2 As People = LoadControl("~/controls/people.ascx")
    mybtn2.ID = "btnOwnerPeopleEmployees_Crumb"
    If IsNewControl Then
        mybtn2.ToolTip = "Manage my business employees"
        mybtn2.Text = "Employees"
    End If
    AddHandler mybtn2.Click, AddressOf OwnerLandingPeopleRedir
    CookieCrumbs.Controls.Add(mybtn2)
End Sub

接下来,删除Page_Load中调用 BuildCrumbs 的代码,而是将其放在占位符的 init 事件中:

Private Sub CookieCrumbs_Init(sender As Object, e As EventArgs) Handles CookieCrumbs.Init
    BuildCrumbs(Not Page.IsPostBack)
End Sub

动态控件的工作方式是,首次将其添加到窗体时,需要创建有关它的所有内容,例如设置其 ID、工具提示和文本属性。 但是,在回发时,只需创建设置了 ID 属性的控件并将其添加到页面上的同一位置,页面的 ViewState 处理将使用其正确的值重新填充控件。

我有一个示例项目,如果您需要进一步澄清,我可以为您提供。

最新更新