Найти скрытое значение поля, когда кнопка ссылки находится внутри вложенного повторителя

<asp:Repeater ID="rptHotels" runat="server" OnItemDataBound="rptHotels_ItemDataBound">
                    <ItemTemplate>
                        <div class="hotel-box">
                            <div class="hotel-img">
                                <asp:HiddenField ID="hdnHotelCode" runat="server" Value='<%#Eval("HotelCode")%>' />
                                <a class="preview" href='<%#Eval("ImageURL_Text") %>' title='<%#Eval("HotelName")%>' target="_blank">
                                    <img src='<%#Eval("ImageURL_Text") %>' alt='<%#Eval("HotelName")%>' height="75px"
                                        width="100px" />
                                </a>
                            </div>
                            <div class="hotel_heeading_content">
                                <div class="hotel_heading">
                                    <h2>
                                        <asp:LinkButton ID="lnkHotelDetail" runat="server" OnClick="lnkHotelDetail_Click">                                      
                                            <%#Eval("HotelName")%>
                                            (
                                            <%#Eval("boardType")%>)
                                        </asp:LinkButton>
                                    </h2>
                                </div>
                                <div class="stars">
                                    <span class="stars">
                                        <%#Eval("StarRating")%></span>
                                </div>
                                <div class="hotel_text">
                                    <%#Eval("HotelAddress")%>,
                                    <%#Eval("Destination")%>
                                    ,<%#Eval("Country")%>
                                    <img src="images/ico_point2.png" alt="" id="mapicon" class="mapicon" />
                                    <input type="hidden" id="hdnLatitude" class="hdnLatitude" runat="server" value='<%#Eval("Latitude")%>' />
                                    <input type="hidden" id="hdnLongitude" class="hdnLongitude" runat="server" value='<%#Eval("Longitude")%>' />
                                    <input type="hidden" id="hdnInfoWindow" class="hdnInfoWindow" runat="server" />
                                </div>
                            </div>
                            <p>
                                <asp:Literal ID="ltDes" runat="server"></asp:Literal>
                            </p>
                            <p>
                                <a href="#">more info</a>
                            </p>
                            <div class="btn">

                                <asp:LinkButton ID="lnkPrice" runat="server"  Text=' <%#Eval("totalPrice")%>'  OnClick="lnkHotelDetail_Click" ></asp:LinkButton>


                            </div>
                            <div class="roominfo">
                                <asp:Repeater ID="rptRooms" runat="server">
                                    <HeaderTemplate>
                                        <div class="rooms">
                                            <div class="roominfoheader">
                                                <div class="roomheaderlbl">
                                                    Room Name</div>
                                                <div class="roomheaderlbl">
                                                    Total Room Rate</div>
                                                <div class="roomheaderlbl">
                                                    Book Now</div>
                                            </div>
                                        </div>
                                    </HeaderTemplate>
                                    <ItemTemplate>
                                        <div class="rooms">
                                            <div class="roominforow">
                                                <div class="roominforowlbl">
                                                    <asp:Label ID="lblRoomName" runat="server" Text='<%#Eval("roomCategory") %>'></asp:Label></div>
                                                <div class="roominforowlbl">
                                                    $
                                                    <asp:Label ID="Label1" runat="server" Text='<%#Eval("totalRoomRate") %>'></asp:Label></div>
                                                <div class="roominforowlbl">
                                                   <asp:LinkButton ID="lnkBookNow" runat="server"  Text="Book Now" OnClick="lnkBookNow_Click"></asp:LinkButton></div>
                                            </div>
                                        </div>
                                    </ItemTemplate>
                                </asp:Repeater>
                            </div>
                        </div>
                    </ItemTemplate>
                </asp:Repeater>

У меня есть выше HTML для вложенного повторителя. Я могу найти скрытое значение поля, которые содержат код отеля, следующим методом

protected void lnkHotelDetail_Click(object sender, EventArgs e)
    {
        LinkButton btn = (LinkButton)sender;
        var item = (RepeaterItem)btn.NamingContainer;
        HiddenField hdnHotelCode = (HiddenField)item.FindControl("hdnHotelCode");



    }

но проблема в том, что теперь я должен найти скрытое значение поля, когда нажата кнопка ссылки шаблона вложенного элемента репитера. Вы можете проверить, что lnkBookNow является кнопкой ссылки, которая находится внутри rptRooms повторитель.

protected void lnkBookNow_Click(object sender, EventArgs e)
    {
        LinkButton btn = (LinkButton)sender;
        var item = (RepeaterItem)btn.NamingContainer;
        HiddenField hdnHotelCode = (HiddenField)item.FindControl("hdnHotelCode");


    }

Я попробовал что-то подобное, но не нашел скрытого поля.

1 ответ

Решение

Проблема здесь в том, что lnkBookNow.NamingContainer является rptRooms, Этот элемент управления, очевидно, не содержит hdnHotelCode,

Я думаю, что вы должны быть в состоянии сделать это с:

protected void lnkBookNow_Click(object sender, EventArgs e)
{
    LinkButton btn = (LinkButton)sender;
    var item = (RepeaterItem)btn.NamingContainer.NamingContainer.NamingContainer;
    HiddenField hdnHotelCode = item.FindControl("hdnHotelCode") as HiddenField;
}

btn.NamingContainer это RepeaterItem в rptRooms, NamingContainer это Repeater сам. Наконец, NamingContainer из rptRooms это RepeaterItem из rptHotels, в котором вы хотите найти свой HiddenField,

Обратите внимание на мое использование as ключевое слово вместо явного приведения - это защитит вас от исключений NullReferenceExceptions, если FindControl возвращает ноль. Конечно, вы должны явно проверить, что hdnHotelCode не является нулевым, прежде чем пытаться получить к нему доступ.

Другие вопросы по тегам