转发器内的用户控件 - 回发后没有变化

时间:2011-07-15 21:54:24

标签: .net asp.net repeater

我在转发器中有自己的用户控件。它根据列表元素评级显示星标。在第一次绑定时一切正常,每个项目的星数都可以。然后我做了一个回发,我在其中筛选此列表。然后结果数据绑定到转发器。让我们说起初我只有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的结果。

2 个答案:

答案 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);
    }