#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, ничего не меняется. Возникает то же исключение.