嗨,只是想得到一个按钮点击事件,从它被按下的特定行发送数据到点击事件本身,这样我就可以把它放到一个URL上,并把它发送到另一个页面,但数据项是空的。
我会提供代码。中继器btw是绑定正确的条款,我可以看到正确的数据对它之前,我按下按钮。
我已经尝试在按钮单击事件中重新绑定中继器,因为我注意到当我按下按钮时,它正在点击页面加载。
我asp.net有一段时间没有做www.example.com了,所以我有点生疏了。
'''
<asp:Repeater ID ="DealerContactsRepeater" runat ="server">
<HeaderTemplate>
<table ID ="ContactsTable">
<tr>
<th></th>
<th style="display:none;">Dealer Contact ID</th>
<th>Title</th>
<th>Fullname</th>
<th>Is Preferred Contact?</th>
<th>Position</th>
<th style="display:none;">Forename</th>
<th style="display:none;">Surname</th>
<th>Phone</th>
<th style="display:none;">Direct</th>
<th style="display:none;">Fax</th>
<th>Mobile</th>
<th>Email</th>
<th style="display:none;">Secondary Email</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td> <asp:Button ID="btnEdit" runat="server" Text="Edit" OnClick="btnEdit_Click" CommandArgument='<%# Container.ItemIndex %>' /></td>
<td style="display:none;"><%# Eval("DealerContactId") %></td>
<td><%# GetTitleText((byte)Eval("NameTitleId")) %></td>
<td><%# Eval("Forename") %> <%# Eval("Surname") %></td>
<td><asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Eval("DecisionMaker") %>' Enabled="false" /></td>
<td><%# GetPositionText((byte)Eval("DealerContactPositionId")) %></td>
<td style="display:none;"><%# Eval("Forename") %></td>
<td style="display:none;"><%# Eval("Surname") %></td>
<td><%# Eval("PhoneNumber") %></td>
<td style="display:none;"><%# Eval("DirectDialNumber") %></td>
<td style="display:none;"><%# Eval("FaxNumber") %></td>
<td><%# Eval("MobileNumber") %></td>
<td><%# Eval("EmailAddress") %></td>
<td style="display:none;""><%# Eval("SecondaryEmail") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
“”protected void Page_Load(object sender,EventArgs e){ if(!String getString();}
}
private void BindContactsRepeater()
{
DealerContactsRepeater.DataSource = GetDealerContactInfo();
DealerContactsRepeater.DataBind();
}
'''按钮点击事件:
protected void btnEdit_Click(object sender, EventArgs e)
{
Button btnEdit = (Button)sender;
RepeaterItem item = (RepeaterItem)btnEdit.NamingContainer;
try
{
DataRowView row = (DataRowView)item.DataItem;
int dealerContactId = Convert.ToInt32(row["DealerContactId"]);
ContactTitles title = (ContactTitles)Enum.Parse(typeof(ContactTitles), row["NameTitleId"].ToString());
bool isChecked = Convert.ToBoolean(row["DecisionMaker"]);
ContactPositions position = (ContactPositions)Enum.Parse(typeof(ContactPositions), row["DealerContactPositionId"].ToString());
string forename = row["Forename"].ToString();
string surname = row["Surname"].ToString();
string phone = row["PhoneNumber"].ToString();
string direct = row["DirectDialNumber"].ToString();
string fax = row["FaxNumber"].ToString();
string mobile = row["MobileNumber"].ToString();
string email = row["EmailAddress"].ToString();
string secondEmail = row["SecondaryEmail"].ToString();
string editUrl = $"EditPage.aspx?dealerContactId={dealerContactId}&title={(int)title}&isChecked={isChecked}&position={(int)position}&forename={Uri.EscapeDataString(forename)}&surname={Uri.EscapeDataString(surname)}&phone={Uri.EscapeDataString(phone)}&direct={Uri.EscapeDataString(direct)}&fax={Uri.EscapeDataString(fax)}&mobile={Uri.EscapeDataString(mobile)}&email={Uri.EscapeDataString(email)}&secondEmail={Uri.EscapeDataString(secondEmail)}";
Response.Redirect(editUrl);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
'''
任何帮助将不胜感激。
1条答案
按热度按时间egdjgwm81#
不幸的是,与桌面不同,数据绑定行在绑定完成后不可用。但是,在数据绑定事件期间它是可用的。
这个“事实”往往可以很好地利用,因为在行数据绑定事件上,那么所有行的数据源都可以使用。因此,税务计算,或隐藏/显示或任何可以在该事件中做的事情。
但是,一旦绑定完成,数据项源就消失了,并且超出了范围。
所以,为了一个简单的按钮点击?
如果您需要这些信息(重复项中不存在的行或数据),那么您必须重新提取数据。
如果数据行不多,那么另一种方法可以是将数据源保存在session()中,或者可能是viewstate中。
Viewstate很不错,因为它是“每一个网页”,如果一个用户有2个相同的页面在同一时间打开,那么它就会工作。但是,viewstate会随网页一起移动,并且会增加任何按钮点击的大小(viewstate包含在回发中,它会导致性能问题)。
Session()是100%服务器端的,但是每个用户的,而不是每个页面的-所以在这里要注意,因为这可能会阻止用户打开两个浏览器页面到同一个URL。
中继器缺少的另一个大特征当然是“数据密钥”。数据键真的很好,因为该功能可以为您“管理”数据库行PK id,但您永远不必向客户端网页和标记公开PK id值。出于这个原因,我经常避免使用中继器。
那么,那么:
不,你不能用一个按钮点击。你可以在数据绑定期间执行上述操作,比如我提到的行数据绑定事件。
因此,这建议您:
重新提取数据或持久化数据源。
但是,数据的重新提取?嗯,你也没有数据密钥(对于中继器!!)。您可以为listview,gridview。
所以,我咬紧牙关,冒更少的安全风险,我经常说会这样做:
所以,对于按钮点击代码,我可以这样做:
所以,请注意我们如何自由地获取/抓取中继器行,并自由地抓取控件+来自这些控件的值。
但是,如上所述,数据绑定源将超出范围。
如果我们的数据源被持久化到会话中,那么我可以这样做:
所以,你可以将你的数据对象(GetDealerContactInfo())推入session或viewstate,并按上面的行索引拉出。