我想要做的是每当用户点击我的aspx中的静态LinkButtons时生成链接按钮,如下所示:
他们看起来像这样:
<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
事件,但它不会被触发。单击生成的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之后生成它,然后它们上的click事件才会生效。
感谢任何形式的帮助
答案 0 :(得分:0)
在页面生命周期通过正在处理事件的点之后,您正在创建LinkButton
个实例。因此,当您的事件处理程序应该被调用时,实际上LinkButton
中的没有 Page
实例,因此无法调用。
您应该在LoadBreadCrumb
事件的上下文中创建所有动态控件(即调用PreInit
)。请参阅ASP.NET页面生命周期documentation in MSDN。
旁注:他们构建面包屑的方式在SharePoint中的URL路径构造选项方面有点不理想。您应该考虑到存在直接与任何网站集(SPSite
)不对应的托管路径,并且有一些子网站(SPWeb
嵌套在SPSite
&#39; s根网站)沿着路径。目前,通过使用作为管理路径或子网站URL的参数调用new SPSite(url)
,您将最终得到立即封闭的网站集,而该网站集又表示与{{1}中的网址不同的网址}}