我在转发器中有自己的用户控件。它根据列表元素评级显示星标。在第一次绑定时一切正常,每个项目的星数都可以。然后我做了一个回发,我在其中筛选此列表。然后结果数据绑定到转发器。让我们说起初我只有5个elemetns过滤后只有3个但是只有3个是可见的但是星星按顺序排列。
我想要的是在回发期间,每个控件都应该重新创建,并且应该重新显示适当数量的星号(不是旧的)。
我做错了什么?
转发器位于updatePanel内。
这是我的控件“明星”代码:
<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();
}
确定选择要检查的输入属性(“已选中”):
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;
}
}
在调试过程中,我可以看到代码行为正确并且在一个好星上设置了checked属性,但是没有渲染HTML的结果。
答案 0 :(得分:1)
您可以考虑使用ASP.Net Ajax Rating控件,这将为您节省大量时间。
http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Rating/Rating.aspx
答案 1 :(得分:0)
我在我的星形控件中的Render中添加了方法,它开始按原样运行:
protected override void Render(HtmlTextWriter writer){
SetStarsRating();
base.Render(writer);
}