2015-10-08 4 views
0

У меня есть Repeater и Button. В Repeater У меня есть HiddenField контроль:ASP.NET HiddenField значение дублируется в Repeater после обратной передачи

<asp:Repeater runat="server" ID="rptItems">   
    <ItemTemplate>       
     <asp:HiddenField runat="server" ID="hfReportId"></asp:HiddenField> 
    </ItemTemplate> 
</asp:Repeater> 

<asp:Button runat="server" ID="btnSave" Text="Save" /> 

В коде позади, я привязки обработчика ItemDataBound событий в Repeater в Page_Load:

this.rptItems.ItemDataBound += new RepeaterItemEventHandler(rptItems_ItemDataBound); 

В обработчик событий, я устанавливаю значение программного обеспечения HiddenField:

protected void rptItems_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
    { 
     var hfReportId = (HiddenField)e.Item.Controls[0].FindControl("hfReportId"); 
     hfReportId.Value = "TestValue"; 
    }  
} 

До сих пор это работает как ex и значение HiddenField установлено на «TestValue».

Проблема возникает при обратной передаче. Если я нажмю кнопку «Сохранить», обработчик события ItemDataBound будет запущен снова, а значение HiddenField будет установлено еще раз, однако исходное значение сохраняется, и я получаю значение «TestValue, TestValue». Я поменял HiddenField на контроль над меткой, и этого бахавира не бывает.

Я прошел через код, и когда обработчик события ItemDataBound срабатывает при обратной передаче, нет значения для HiddenField.

Любая помощь приветствуется.

+1

Не используйте '() e.Item.Controls скрытого [0] .FindControl ("hfReportId");' 'а (скрытый) e.Item.FindControl ("hfReportId"); '. Он RepeaterItem - это NamingContainer, поэтому он более безопасен. Попробуйте зарегистрировать событие декларативно: '' –

+1

Также вы используете JQuery и/или ASP.NET Ajax? Является ли этот повторитель в диалоговом окне пользовательского интерфейса jQuery? –

+0

Да - я использую ASP.NET Ajax. Это, по-видимому, является причиной проблемы - когда я удаляю его, HiddenField обновляется, как ожидалось. Кажется, что элементы управления HiddenField обрабатываются по-разному с элементами управления Label? – Ash

ответ

0

Вы должны связать событие данных элементов, связанные в повторителе на странице ASPX, как

OnItemDataBound="repeater_ItemDataBound" 

использование загрузки страницы IsPostBack собственность при связывании ретранслятора

if(!IsPostback) 
{ 
    //Bind repeater 
} 

затем в данных элементов связаны использование

var hfReportId = (HiddenField)e.Item.FindControl("hfReportId"); 

вместо

var hfReportId = (HiddenField)e.Item.Controls[0].FindControl("hfReportId"); 

Счастливый Coding