我的aspx中的页面生命周期问题

时间:2014-03-25 21:36:50

标签: c# asp.net viewstate page-lifecycle prerender

我想要做的是每当用户点击我的aspx中的静态LinkBut​​tons时生成链接按钮,如下所示:

他们看起来像这样:

<asp:LinkButton ID="lnkSubWeb" runat="server" OnCommand="lbWeb_Click" />

触发的方法如下:

/// <summary>
/// Handles the Click event of the lbWeb control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="CommandEventArgs"/> instance containing the event data.</param>
protected void lbWeb_Click(object sender, CommandEventArgs e)
{
    var url = e.CommandArgument.ToString();
    using (var site = new SPSite(url))
    {
        using (var selectedWeb = site.OpenWeb())
        {
            ViewState["RelativeUrl"] = selectedWeb.ServerRelativeUrl;
            ViewState["WebUrl"] = selectedWeb.Url;
            LoadWebItems(selectedWeb);
        }
    }
}

据我所知,页面循环就像这个页面加载 - &gt;按钮点击 - &gt; Page prerender。

基本上,当用户点击此链接按钮时,我想动态生成5个链接按钮,并添加lbWeb_Click事件,但它不会被触发。单击生成的LinkBut​​tons时没有任何反应。

因此,当我将数据存储到ViewState时,我使用以下方法生成这些链接按钮:

private void Page_PreRender(object sender, EventArgs e)
{
    RelativeUrl = (string)ViewState["RelativeUrl"];
    WebUrl = (string)ViewState["WebUrl"];
    if (!string.IsNullOrEmpty(RelativeUrl))
    {
        LoadBreadCrumb(RelativeUrl, WebUrl);
    }
}

LoadBreadCrumb()方法如下所示:

private void LoadBreadCrumb(string relativeurl, string weburl)
{

    var relativePath = relativeurl.Substring(1);
    var urlList = weburl.ParseUrl();
    var linkList = new List<string>(relativePath.Split('/'));
    for (int i = 0; i < linkList.Count; i++)
    {
        var link = UppercaseFirst(linkList[i]);
        var linkButton = new LinkButton
        {
            Text = link + " > ",
            CssClass = "breadcrumb",
            CommandArgument = urlList[i]
        };
        linkButton.Command += lbWeb_Click;
        bcHolder.Controls.Add(linkButton);

    }

}

所以基本上这些代码会按照我想要的方式生成链接按钮,但lbWeb_Click不会被激发。

另一方面,我试图将此代码放在Page_Load中并且不能正常工作,它总是落后一步。 LinkBut​​tons会在单击事件后显示,但是在Page_Load之后生成它,然后它们上的click事件才会生效。

感谢任何形式的帮助

1 个答案:

答案 0 :(得分:0)

在页面生命周期通过正在处理事件的点之后,您正在创建LinkButton个实例。因此,当您的事件处理程序应该被调用时,实际上LinkButton中的没有 Page实例,因此无法调用。

您应该在LoadBreadCrumb事件的上下文中创建所有动态控件(即调用PreInit)。请参阅ASP.NET页面生命周期documentation in MSDN


旁注:他们构建面包屑的方式在SharePoint中的URL路径构造选项方面有点不理想。您应该考虑到存在直接与任何网站集(SPSite)不对应的托管路径,并且有一些子网站(SPWeb嵌套在SPSite&#39; s根网站)沿着路径。目前,通过使用作为管理路径或子网站URL的参数调用new SPSite(url),您将最终得到立即封闭的网站集,而该网站集又表示与{{1}中的网址不同的网址}}