【问题标题】:Problems with Page Lifecycle in my aspx我的 aspx 中的页面生命周期问题
【发布时间】:2014-03-25 21:36:50
【问题描述】:

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

它们看起来像这样:

<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);
        }
    }
}

据我所知,页面循环的工作方式类似于页面加载 -> 按钮单击 -> 页面预渲染。

所以基本上当用户单击此链接按钮时,我想动态生成 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 之后生成的,然后它们上的点击事件确实有效。

感谢任何形式的帮助

【问题讨论】:

  • 您是否尝试过断点以查看是否有任何东西被击中或似乎什么都没有发生?
  • 是的,lbWeb_click 没有被触发。

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


【解决方案1】:

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

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


旁注:就 SharePoint 中的 URL 路径构建选项而言,您构建面包屑的方式有点欠佳。您应该考虑到存在与任何网站集 (SPSite) 不直接对应的托管路径,并且沿路径存在子网站(SPWeb 嵌套在 SPSite 的根网站中)。目前,通过使用托管路径或子站点 URL 的参数调用 new SPSite(url),您最终将获得立即封闭的站点集合,该站点集合又表示与 url 中的 URL 不同的 URL。

【讨论】:

  • 有什么解决办法吗?是否有可能确保 lbWeb_Click 在 page_load 之前被触发?是的,我知道这一点,并且对于这个解决方案它有效。 ParseUrl() 是一种定制的扩展方法,可以纠正它。
  • 太棒了我会尝试PreInit事件,应该是这样吧? protected void Page_PreInit(object sender, EventArgs e) {//code}
  • 我尝试使用 PreInit,现在似乎没有生成链接按钮。可能是因为 PreInit 在我的点击事件之前执行?
  • 肯定会在之前执行你的事件处理程序。这才是重点!您不能首先执行尚未初始化的事件处理程序。
  • 你真的应该阅读一些关于 ASP.NET 页面生命周期和回发处理的教程。
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多