我要做的是每当用户单击我的 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
事件,但它不会被触发。当我单击生成的 LinkButtons 时没有任何反应。
因此,当我将数据存储到 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 中,但效果不佳,它总是落后一步。LinkButtons 不会在单击事件后显示,但它是在 Page_Load 之后生成的,然后它们上的单击事件实际上有效。
任何形式的帮助表示赞赏