0

我要做的是每当用户单击我的 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 之后生成的,然后它们上的单击事件实际上有效。

任何形式的帮助表示赞赏

4

1 回答 1

0

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

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


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

于 2014-03-25T23:18:36.070 回答