:
这是我在这里的第一篇文章,所以我请求你原谅我的错误:D 我面临的问题如下:我试图从数据列表中的一些“ImageButton”中捕获事件,但我遇到了一些问题。
我需要捕捉任何被触发以执行某些操作的按钮(所以我需要识别它)。该按钮位于由“DataList”包含的用户控件内,该用户控件位于用户控件内,该控件是从页面加载的(也具有母版页)。您可以在这里看到嵌套顺序:Page->User-Control->DataList->User Control->ImageButton
我不得不说 Web 应用程序是使用 Web Forms MVP 模式构建的,因此 Pages(不是控件)有一个 Presenter 来管理所有逻辑并发送数据以绑定 Web 窗体,从而加载所需的控件。
成员.aspx
.......
<%@ Register Src="~/Controls/DataControl.ascx" TagName="DataBox" TagPrefix="dtC" %>
.......
<dtC:DataBox ID="DataBoxControl" runat="server" />
成员.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
_presenter = IoCFactory.Instance.CurrentContainer.Resolve<IMembersPresenter>();
_presenter.Init(this, IsPostBack);
}
......
public void ShowFriendPanel(IList<ContactInfo> friendList)
{
DataBoxControl.FriendsList = friendList.ToList();
}
演示者看起来像这样:
public override void Init(IMemberView view, bool isPostBack)
{
base.Init(view,isPostBack);//authentication and basic stuff
IList<ContactInfo> friendContactList = _userAccountDao.GetFriendsOfUser(CurrentUser.Id, 0, int.MaxValue);
if ((friendContactList.Count > 0))
{
ShowFriendsBox(friendContactList);
}
并且控件 DataBoxControl 包含一个包含另一个用户控件的数据列表
<asp:DataList ID="dataDL" runat="server" OnItemDataBound="dataDL_ItemDataBound" OnItemCommand="dataDL_ItemCommand" >
<ItemTemplate>
<ci1:ContactImage runat="server" ID="ContactImageControl" Height="59px" Width="59" Show="All" />
</ItemTemplate>
</asp:DataList>
最终用户控件 (ContactImage.ascx) 包含 Web 控件“ImageButton”
......
<asp:ImageButton ID="deleteButton" ImageUrl="/images/remove_contact_icon.png" runat="server" />
.......
Id to do action 在“ContactImage”控件中分配给图像按钮“CommandName”,这是单击按钮时我需要检索的值。实际上,ContactImage 用户控件在内部没有做任何事情,我将触发的事件依赖于数据列表上的 OnItemCommand,但我有两个问题:
- 我无法在 Page_Load 之前绑定数据列表,因此当“IsPostBack”为假时,我必须检查数据绑定是否发生;在这种情况下,触发事件不会发生,因为 ContactImage 未能尝试填充其属性(DataList Item 为空,因为 List 未绑定)。
- 如果将数据列表绑定移动到 Page_Init(在用户控件中),则会触发该事件,但 OnItemCommand 根本不会收到任何内容(并且绑定数据列表的列表也是空的)。
我想知道我正在使用的模式是否在某种程度上是负责任的,因为我建立了一个简单的网站并且它可以工作并且事件到达 ItemCommand
简单的网站(在这里它可以工作,但没有使用 MVP 模式) Event.aspx
<h2>
Events
</h2>
<p>
Events into Data List
</p>
<asp:DataList ID="DataListWihtEvents" RepeatDirection="Horizontal" RepeatColumns="4" OnItemCommand="DataList_ItemCommand" runat="server">
<ItemTemplate>
<tnc:TopControl ID="TopControlNested" runat="server" Number="<%# (Container.DataItem) %>" />
</ItemTemplate>
<SeparatorTemplate> </SeparatorTemplate>
</asp:DataList>
<br />
<asp:Label ID="ShowButtonFiredUpTitle" runat="server" Text="Here goes the button that was fired up: " />
<asp:Label ID="ShowButtonFiredUp" runat="server" Font-Bold="True" />
事件.aspx.cs
public partial class Events : System.Web.UI.Page
{
protected List<int> Numbers = new List<int>();
protected void Page_Init(object sender, EventArgs e)
{
for (int i = 1; i < 5; i++)
{
Numbers.Add(i);
}
DataListWihtEvents.DataSource = Numbers;
DataListWihtEvents.DataBind();
}
protected void DataList_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandSource.GetType() == typeof(Button))
{
var b = (Button) e.CommandSource;
ShowButtonFiredUp.Text = b.CommandName;
}
}
TopNestedControl.ascx
<%@ Register Src="~/Controls/BottomNestedControl.ascx" TagName="BottomControl" TagPrefix="bnc" %>
TopNestedControl.ascx.cs
public partial class TopNestedControl : System.Web.UI.UserControl
{
public int Number { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
BottomNestedControl.Number2 = Number;
}
}
底部嵌套控件.ascx
<asp:Button ID="ShowNumberButton" runat="server" Text="Button" CommandName="button fired up!" />
BottomNestedControl.ascx.cs
public partial class BottomNestedControl : System.Web.UI.UserControl
{
public int Number2 { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ShowNumberButton.Text = "Button " + Number2;
ShowNumberButton.CommandName = "#" + Number2;
}
}
在其他页面中,我使用委托来处理事件,但没有使用“DataList”并且事件被捕获而没有问题。如果有人能帮助我解开这个烂摊子,我会很高兴的。
先感谢您,
哈维尔