[asp.net ] проблема с обновлением панели обновлений из серверного кода

#asp.net #updatepanel

#asp.net #панель обновления

Вопрос:

В моем приложении у меня есть простая загрузка с помощью jquery и пользовательского http-обработчика, привязанного к кнопке, и панель обновления для отображения имени загруженного файла:

 <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:Button ID="btnUploadFile" runat="server" Text="Button" />
    <%= System.DateTime.Now %>
    <input id="File1" type="file" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
        <ContentTemplate>
            <br />
            <br />
            <%= System.DateTime.Now %>
            <asp:Label ID="Label1" runat="server" Text="" ViewStateMode="Disabled"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

$(document).ready(function ()
{
    $(function ()
    {
        $('#file_upload').fileUpload({
            url: '../UploadHandler.ashx',
            method: 'POST',
            onLoadAll: function (list)
            {
               // __doPostBack('MainContent_UpdatePanel1', '');
            }
        });
    });

    $('#File1').hide();

    $('#MainContent_btnUploadFile').click(function ()
    {
        $('#File1').click();

        return false;
    });
});
  

Обработчик выглядит так:

 public void ProcessRequest(HttpContext context)
        {
            HttpPostedFile uploadedfile = context.Request.Files[0];

            string fileName = uploadedfile.FileName;

            IMainFormViewPresenter presenter = Bootstrapper.ServiceLocator.GetService<IMainFormViewPresenter>();
            //do sth..
            presenter.SetFileInfo(fileName);
            presenter.RefreshUpdatePanel();
        }
  

и в представлении

 public void RefreshUpdatePanel()
        {
           // UpdatePanel1.Update();
        }
public void SetFileInfo(string fileName)
        {
            Label1.Text = fileName;
        }
  

Проблема в том, что UpdatePanel1.Update() в коде сервера не работает. Иногда я получаю исключение: метод Update может быть вызван только на UpdatePanel с идентификатором ‘UpdatePanel1’ перед рендерингом.

Я не могу выяснить, что происходит. Панель обновления, обновленная с помощью javascript, работает нормально, но мне любопытно, почему на сервере возникла проблема. Полное решение, которое я поместил здесь https://dl-web.dropbox.com/get/Public/WebApplication1.rar?w=ea9959b6

Ответ №1:

Поскольку кнопка находится за пределами вашей панели обновления, вам нужно будет добавить триггер на вашу панель обновления, который имеет ControlID вашей кнопки и событие нажатия, поэтому в вашей панели обновления добавьте следующее:

 <asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
    <ContentTemplate>
        <br />
        <br />
        <%= System.DateTime.Now %>
        <asp:Label ID="Label1" runat="server" Text="" ViewStateMode="Disabled"></asp:Label>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btnUploadFile" EventName="Click" />
    </Triggers>
</asp:UpdatePanel>
  

Это подскажет вашей панели обновления обращаться с кнопкой так, как если бы она была внутри панели обновления, и участвовать в частичных обратных отправках, как если бы она была внутри панели обновления.

HTH.

Комментарии:

1. Что в ситуации, когда кнопка находится на другом usercontrol? (не в этом примере, но это всего лишь небольшой фрагмент, вырезанный из моего проекта). Я проверю решение с помощью триггера, но в такой ситуации, когда я могу напрямую использовать метод Update ()? Только в событиях из элементов управления, которые размещены в этой панели обновлений?

2. Если я правильно понимаю запрос, вам нужно было бы зарегистрировать элемент управления, вызывающий обратную отправку (ваш пользовательский элемент управления или элемент управления внутри вашего пользовательского элемента управления), в коллекции триггеров updatepanel, пример того, как это сделать, можно найти здесь: forums.asp.net/t/1124967.aspx

3. Я переместил кнопку из вышеупомянутого решения в пользовательский элемент управления и добавил в основную форму для события Page_Load: триггер AsyncPostBackTrigger = новый триггер AsyncPostBackTrigger(); триггер. ControlID = ((Кнопка)WebUserControl11. Элементы управления [0]). Идентификатор клиента; триггер. eventName = «click»; UpdatePanel1. Срабатывает. Добавить (триггер); но у меня есть исключение: не удалось найти элемент управления с идентификатором ‘MainContent_WebUserControl11_btnUploadFile’ для триггера в панели обновлений ‘UpdatePanel1’. Чего я не понимаю?

4. Я не думаю, что это было бы ((кнопка)WebUserControl11. Элементы управления [0]). ClientID (который в основном используется для взаимодействия javascript между элементами управления) Это должно быть просто ((кнопка)WebUserControl11. Элементы управления[0]).ИДЕНТИФИКАТОР

5. Когда я меняю ClientID на ID, ничего не меняется. Возникает то же исключение.