我在使用UpdatePanel并通过javascript更改转发器内控件的“class”属性时遇到了问题。
这里有一些代码:
- 关于aspx -
<script type="text/javascript">
function changeClass(ctl) {
if (ctl.className == "marked") {
ctl.className = "unmarked";
} else {
ctl.className = "marked";
}
}
</script>
<!-- some html -->
<asp:UpdatePanel ID="upp" runat="server">
<ContentTemplate>
<asp:Repeater ID="rpt1" runat="server" onitemdatabound="rpt1_ItemDataBound">
<ItemTemplate>
<a id="aButton" runat="server" href="javascript:void(0)">
<!-- some other controls -->
</a>
</ItemTemplate>
</asp:Repeater>
</ContentTemplate>
</asp:UpdatePanel>
- 代码隐藏 -
protected void rpt1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
MyClass obj = (MyClass)e.Item.DataItem;
((HtmlAnchor)e.Item.FindControl("aButton")).Attributes.Add("class", "marked");
//some other code....
}
}
//method called after the bind on 'rpt1'
private void mymethod()
{
foreach (RepeaterItem ri in rpt1.Items)
{
HtmlAnchor aButton = (HtmlAnchor)ri.FindControl("aButton");
if (Must-be-unmarked)
aButton.Attributes.Add("class", "unmarked");
aButton.Attributes.Add("OnClick", "changeClass(this);");
}
}
问题是,当我点击“aButton”时,类会正常更改,但是当我进入代码隐藏并获得控制权以检查它是否已标记或未标记时,我只会将控件标记为转发器的ItemDataBound,而不是我在执行时标记的“aButton”。
这是我为了标记“aButton”所做的工作:
private void checkMarked()
{
foreach (RepeaterItem ri in rpt1.Items)
{
if (((HtmlAnchor)ri.FindControl("aButton")).Attributes["class"] == "marked")
{
//do something...
}
}
}
答案 0 :(得分:1)
当您从客户端代码更改类属性时,服务器端将不知道它。
您需要添加标记为/ unmakred的隐藏<input>
,以便您可以在回发后检查服务器中的内容。
另一种方法是当项目从标记/未标记更改时,直接将javscript回发到服务器。