【发布时间】:2011-07-16 07:29:28
【问题描述】:
我在中继器中有自己的用户控件。它根据列表元素评级显示星星。在第一次绑定时一切正常,每个项目的星数都可以。然后我进行回发,在其中过滤此列表。然后结果数据绑定到转发器。假设起初我只过滤了 3 个元素后有 5 个元素,但只有 3 个是可见的,但星星的顺序与绑定前一样。
我想要的是在回发期间应该重新创建转发器内部的每个控件并显示适当数量的星星(不是旧的)。
我做错了什么?
中继器位于更新面板中。
这是我的控制“星星”代码:
<span runat="server" id="starHolder" class="starsHolder" title="">
<input runat="server" id="star1" name="star3" type="radio" class="star1" value="1" />
<input runat="server" id="star2" name="star3" type="radio" class="star1" value="2" />
<input runat="server" id="star3" name="star3" type="radio" class="star1" value="3" />
<input runat="server" id="star4" name="star3" type="radio" class="star1" value="4"/>
<input runat="server" id="star5" name="star3" type="radio" class="star1" value="5"/>
</span>
这是我的中继器代码:
<asp:Repeater EnableViewState="false" OnItemDataBound="RptrTopRated_OnDataItemBound" ID="rptrTopRated" runat="server">
<ItemTemplate>
<li class="topRated" id='<%#DataBinder.Eval(Container.DataItem, "[id]")%>'>
<p>
<%# DataBinder.Eval(Container.DataItem, "[title]") %>
</p>
<span class="ratingStar">
<cms:stars EnableViewState="false" runat="server" id="ctrlRating" McID='<%#System.Convert.ToInt32(DataBinder.Eval(Container.DataItem, "[id]"))%>' Mode="small"></cms:stars>
</span>
<a href="#" class="greenLink png" title="Leer más">Leer más</a>
</li>
</ItemTemplate>
</asp:Repeater>
enableViewsstate 设置为 true 还是 false 都没有关系。
在转发器的 ItemBound 事件上我什至设置了代码:
protected void RptrTopRated_OnDataItemBound(object sender, RepeaterItemEventArgs e)
{
((stars)e.Item.FindControl("ctrlRating")).SetStarsRating();
}
它决定了哪个输入应该选择 attrbute("checked") 来检查:
public void SetStarsRating() {
int rate = GetRate();
this.starHolder.Attributes["title"] = McID.ToString();
if(star1.Attributes["checked"] != null) star1.Attributes.Remove("checked");
if(star2.Attributes["checked"] != null) star2.Attributes.Remove("checked");
if(star3.Attributes["checked"] != null) star3.Attributes.Remove("checked");
if(star4.Attributes["checked"] != null) star4.Attributes.Remove("checked");
if(star5.Attributes["checked"] != null) star5.Attributes.Remove("checked");
switch (rate)
{
case 1:
star1.Attributes["checked"] = "checked";
break;
case 2:
star2.Attributes["checked"] = "checked";
break;
case 3:
star3.Attributes["checked"] = "checked";
break;
case 4:
star4.Attributes["checked"] = "checked";
break;
case 5:
star5.Attributes["checked"] = "checked";
break;
}
}
在调试过程中,我可以看到代码行为正确,并将选中的属性设置为良好的一星,但在呈现 HTML 时没有结果。
【问题讨论】:
-
尝试删除 UpdatePanel
-
我不认为你是认真的
-
你有这个控件的源代码吗?如果需要,您可以更改它吗?
-
我只是想知道为什么在中继器、更新面板等内部总是有这么多动态控件的问题......
-
@gruber 更新面板内部出现了很多很多问题。你试过删除它吗?如果您有,并且它在没有更新面板的情况下也能正常工作,那么我们离修复它更近了一步。