【问题标题】:User controls inside repeater - no changes after postback中继器内的用户控件 - 回发后没有更改
【发布时间】: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 更新面板内部出现了很多很多问题。你试过删除它吗?如果您有,并且它在没有更新面板的情况下也能正常工作,那么我们离修复它更近了一步。

标签: .net asp.net repeater


【解决方案1】:

您可以考虑使用 ASP.Net Ajax Rating 控件,这将为您节省大量时间。

http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Rating/Rating.aspx

【讨论】:

  • @gruber 这是一个合法的答案。你没有提到那个限制。请检查你的态度,你会得到更好的回应。
  • 我在写这个问题,而那个写的是完全不同的东西,抱歉更不用说它毫无意义了
  • @gruber 或许,但必须有比“你一定是在开玩笑”更好的表达方式
【解决方案2】:

我在星形控件的 Render 中添加了方法,它开始正常工作:

 protected override void Render(HtmlTextWriter writer){
        SetStarsRating();
        base.Render(writer);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 2012-01-03
    • 1970-01-01
    • 2012-05-21
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多