2013-10-04 3 views
0

У меня есть сайт asp.net (C# backend), который загружает информацию из базы данных. Это позволяет пользователям сохранять информацию, нажав кнопку добавления/удаления. Эта кнопка динамически изменяется в зависимости от того, сохранил ли пользователь ее или нет. Я использую commandnames и аргументы для передачи данных. Когда кнопка нажата, она остается на одной странице и просто обновляет внешний вид (делает обратную передачу). Это нормально работает при нормальных условиях. Однако, если пользователь переходит от страницы, а затем обратно на страницу, он повторно выполняет метод OnClick для кнопки, которая была нажата.Событие ASP.NET Button срабатывает при нажатии кнопки назад

Я знаю, что он делает обратную передачу при использовании кнопки «Назад», но почему он запускает последний onclick? Это нормальное поведение? Я попытался отключить кеширование и попытался сделать страницу истечением срока, и все, но ничего не работает. Данные отображаются в ретрансляторе, а ViewState включен ... из того, что я читал, мне интересно, является ли это причиной. Однако, если ViewState отключен, то при обратной передаче результатов не будет. Если это проблема, есть ли другой способ получить данные для динамического обновления в Repeater без использования ViewState? Не уверен, что это будет какая-то помощь, но разметка кнопки, которая показывает имя команды и аргумент, приведена ниже.

<asp:Repeater ID="ItemRepeater" runat="server" EnableViewState="true"> 
    <!--Lots of other code before pressed button--> 
    <asp:Button ID="additembutton" runat="server" OnClick="AddDelOnClick" Text='<%# textToDisplay((int)Eval("isSaved")) %>' 
    CommandName='<%# DataBinder.Eval(Container.DataItem, "isSaved").ToString().Trim() %>' 
    CommandArgument='<%# DataBinder.Eval(Container.DataItem, "itemnumber").ToString().Trim() + "~" + 
     DataBinder.Eval(Container.DataItem, "department").ToString().Trim() + "~" + 
     DataBinder.Eval(Container.DataItem, "itemdescription").ToString().Trim() + "~" + 
     DataBinder.Eval(Container.DataItem, "isSaved").ToString().Trim()%>' 
    CssClass='<%# cssClassToDisplay((int)Eval("isSaved")) %>' /></td></tr> 

ответ

0

Получил это быстро ... должно было протянуться немного дольше, прежде чем спрашивать. Изменено:

CommandName='<%# DataBinder.Eval(Container.DataItem, "isSaved").ToString().Trim() %>' 

в

CommandName='AddorDelete' 

и изменил код серверной только изменить CommandArgument.

1

Я поеду с «нормальным поведением». Это всегда было для меня шипом, и мое очень элегантное решение заключается в том, чтобы обернуть обратную передачу в UpdatePanel ... что приводит к другим проблемам и потребностям, но по крайней мере кнопка «назад» ничего не запускает, и я никогда не могу показаться для управления моими конечными пользователями.

<asp:ScriptManager id="smPage" runat="server"/> 

    <asp:UpdatePanel id="upPnlRepeater" runat="server"> 
     <ContentTemplate> 
      <asp:Repeater id="YourRepeater"> 
      </asp:Repeater> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
+0

Самое смешное, что у меня есть другая страница, которая делает что-то подобное (просто обновление вместо добавления/удаления), и оно отлично работает при использовании обратно. Мне еще предстоит найти что-то другое, кроме того, как я делаю имя команды, но до сих пор мне не повезло. Этот код вы здесь делаете на главной странице или на странице с элементами управления? –

+0

ОК, похоже, что это по-прежнему нормальное поведение, но изменение моего аргумента команды привело меня к тому, где я должен был быть, когда все изломы были разработаны. Кажется, я всегда отвечаю на свой вопрос сразу после публикации. –

+0

спасибо за обновление – AdamRoof

Смежные вопросы