Несколько UpdatePanels и состояние - PullRequest
1 голос
/ 29 января 2009

У меня есть пользовательский элемент управления с несколькими панелями обновления


При загрузке страницы я загружаю дочерний пользовательский элемент управления динамически в PlaceHolder (я делаю это каждый раз и не проверяю обратную передачу)

Я хочу поддерживать состояние изменений, которые пользователь вносит в дочерний пользовательский элемент управления. (Дочерний пользовательский элемент управления имеет элементы управления html наряду с элементами управления asp.net и другими пользовательскими элементами управления).

Дочерний пользовательский элемент управления теряет состояние при каждом нажатии кнопки A или B, которая вызывает обратную передачу. Режим для UpdatePanels был установлен на условный.

В OnPageLoad,

  1. Я загружаю дочерний элемент управления в PlaceHolderA
  2. Этот дочерний элемент управления имеет другой пользовательский элемент управления с большим количеством JS. Пользователь потенциально может вносить изменения в дочерний элемент управления.
  3. Когда они нажимают кнопку A, которая является частью родительского элемента управления, OnPageLoad вызывает перезагрузку дочернего элемента управления, в результате чего он теряет изменения на стороне клиента, сделанные пользователем.

Я бы хотел предотвратить это.

Вот структура HTML страницы ASPX

<UpdatePanel1>
<UpdatePanelChild1>
    <Button A>
    <Button B>
</UpdatePanelChild1>
<UpdatePanelChild2>
    <PlaceHolderA>
</UpdatePanelChild2>    

Ответы [ 5 ]

1 голос
/ 10 февраля 2009

Похоже, вы теряете ViewState для своего динамически добавляемого дочернего элемента управления.

Это потому, что вы добавляете его слишком поздно в жизненном цикле страницы: ViewState загружается до события Page.Load.

Попробуйте вместо этого добавить свой дочерний элемент управления в Page.Init.

1 голос
/ 05 февраля 2009

При динамическом добавлении элементов управления их необходимо добавлять каждый раз при загрузке страницы. Мне пришлось решать подобные проблемы, и я делаю это двумя способами. Где динамические поля добавляются на лету, я фактически добавлю скрытый элемент управления на страницу, прежде чем пользователь щелкнет, чтобы заполнить его или добавить его самостоятельно. Создавая этот тип заполнителя, система может правильно начать работу с viewstate, что сохраняет изменения пользователей. Вторая проблема, о которой я слышал, это то, что могут быть проблемы с обновлениями панели обновлений chich. Хорошо, если они установлены в условный код вашего кода, вы также можете запускать обновления на других панелях, если вам нужно из кода. Это просто панель обновлений # .update ()

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

0 голосов
/ 29 января 2009

Blockquote // Код в вашем Asp.Net коде

<form runat="server" id="form1">
           <asp:ScriptManager id="ScriptManager1" runat="server" >
                 <Services>
                    <asp:ServiceReference Path="/WebServices/MyService.asmx"/>
                 </Services>
            </asp:ScriptManager> 
        </form>    
            <script language="javascript" type="text/javascript">
                //call with namespace "WebSite" included 
                WebSite.WebServices.HelloWorld(EndHelloWorld);


                function EndHelloWorld()
                {
                    //do whatever
                }
            </script>    
    </form>

Blockquote // Код в вашем классе веб-сервиса

[ScriptService]
    public class MyService : System.Web.Services.WebService
    {
        [WebMethod]
        public void HelloWorld()
        {
           return "Hello world";
        }            
    }

Из скрипта моей страницы я сделаю Ajax против моего веб-сервиса и обратного вызова EndHelloWorld, который вы можете сделать, не теряя состояния.

Надеюсь, это поможет ... С уважением. Josema.

0 голосов
/ 29 января 2009

Похоже, вам нужно удалить вложенные UpdatePanels. В такой структуре:

<ParentUpdatePanel>
  <ChildUpdatePanel1 />
  <ChildUpdatePanel2 />
</ParentUpdatePanel />

ВСЕ панели обновлений ВСЕГДА будут обновляться, даже если дочерние элементы UpdatePanels настроены на условные, потому что родительский объект на самом деле обновляется. Таким образом, событие обратной передачи в одном из дочерних элементов приведет к обновлению родительского элемента.

Использование такого типа паттерна в целом плохо ... если вам нужны события из одной UpdatePanel, чтобы вызвать обновления в другой, вы должны сделать следующее:

<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:Button ID="buttonA" runat="server" />
    <asp:Button ID="buttonB" runat="server" />
  </ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="up2" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:Placeholder ID="ph" runat="server" />
  </ContentTemplate>
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="buttonB" EventName="Click" />
  </Triggers>
</asp:UpdatePanel>
0 голосов
/ 29 января 2009

Вы можете использовать ScriptManager с сервером запуска формы в вашем контроле, вместо обновления панелей.

Таким образом, у вас нет постов.

Вот хороший справочник: http://www.asp.net/Ajax/Documentation/Live/overview/ScriptManagerOverview.aspx

Привет. Josema. http://www.learning -workshop.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...