Обновление панели обновления() метод не работает, как принудительно обновить страницу в функции

#c# #asp.net #ajax #webforms #updatepanel

#c# #asp.net #аякс #веб-формы #панель обновления

Вопрос:

Я пишу страницу, которая загружает PDF-файл с помощью библиотеки SelectPDF. Проблема, с которой я сталкиваюсь, заключается во времени загрузки для рендеринга PDF. Для вывода PDF-файла из HTML требуется около 2-3 секунд.

Это не проблема, но я хочу отключить кнопку, используемую для создания pdf-файла во время этого периода загрузки. Потому что, если пользователь потеряет терпение и снова нажмет на кнопку, процесс начнется сначала.

Я думал, что использование менеджера сценариев и панели обновления позволит мне это сделать, но, похоже, я не могу этого понять. У меня есть частичный рендеринг страницы и режим обновления, установленный на условный, но когда я вызываю метод update() из своего кода, ничего не происходит. Кнопка не отключается до тех пор, пока PDF-файл не завершит визуализацию.

Я хочу принудительно обновить состояние включения кнопки до начала рендеринга PDF, а не после.

Вот мой код

Страница ASPX

 lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %gt;  lt;!DOCTYPE htmlgt;  lt;html xmlns="http://www.w3.org/1999/xhtml"gt;  lt;head runat="server"gt;  lt;titlegt;lt;/titlegt;  lt;link rel="stylesheet" type="text/css" href="main.css" /gt;  lt;/headgt;  lt;bodygt;  lt;form id="frmMain" runat="server"gt;  lt;asp:ScriptManager ID="smMain" EnablePartialRendering="true" runat="server"gt;lt;/asp:ScriptManagergt;  lt;asp:UpdatePanel ID="upMain" UpdateMode="Conditional" runat="server"gt;  lt;ContentTemplategt;  lt;table id="form"gt;  lt;trgt;  lt;tdgt;Page Header:amp;nbsp;amp;nbsp;amp;nbsp;lt;/tdgt;  lt;tdgt;lt;asp:TextBox ID="txtPageHeader" runat="server"gt;lt;/asp:TextBoxgt;lt;/tdgt;  lt;/trgt;  lt;trgt;  lt;tdgt;Page Content:amp;nbsp;amp;nbsp;amp;nbsp;lt;/tdgt;  lt;tdgt;lt;asp:TextBox ID="txtPageContent" runat="server"gt;lt;/asp:TextBoxgt;lt;/tdgt;  lt;/trgt;  lt;trgt;  lt;tdgt;lt;/tdgt;  lt;tdgt;lt;asp:Button ID="cmdLoadPDF" Text="Create PDF" OnClientClick="doLoading();" runat="server" /gt;lt;/tdgt;  lt;/trgt;  lt;trgt;  lt;tdgt;lt;asp:Label ID="lblLoading" Text="Loading" Visible="false" runat="server"gt;lt;/asp:Labelgt;lt;/tdgt;  lt;/trgt;  lt;/tablegt;  lt;iframe id="ifPDF" visible="false" runat="server"gt;lt;/iframegt;  lt;/ContentTemplategt;  lt;Triggersgt;  lt;/Triggersgt;  lt;/asp:UpdatePanelgt;  lt;/formgt;  lt;/bodygt; lt;/htmlgt;  

И мой файл C# для поиска кода

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using System.Threading.Tasks; using SelectPdf;  public partial class _Default : System.Web.UI.Page {  protected void Page_Load(object sender, EventArgs e)  {  ifPDF.Attributes["class"] = "pdf_view";  cmdLoadPDF.Click  = new EventHandler(Click_Event);  }   protected void Click_Event(object sender, EventArgs e)  {  cmdLoadPDF.Enabled = false;  lblLoading.Visible = true;  upMain.Update();   ifPDF.Visible = true;  string pdf_string = File.ReadAllText(Server.MapPath("template.html"));   pdf_string = pdf_string.Replace("{{page_header}}", txtPageHeader.Text);  pdf_string = pdf_string.Replace("{{page_content}}", txtPageContent.Text);   HtmlToPdf make_pdf = new HtmlToPdf();  PdfDocument my_doc = make_pdf.ConvertHtmlString(pdf_string);  byte[] doc_array = my_doc.Save();  my_doc.Close();   string b64_doc = Convert.ToBase64String(doc_array, 0, doc_array.Length);  string pdf_src = $"data:application/pdf;base64,{b64_doc}";  ifPDF.Attributes["Src"] = pdf_src;  } }  

Если бы вы, ребята, могли мне помочь, я был бы вам очень признателен.

Ответ №1:

Почему бы просто не скрыть или отключить кнопку, когда вы нажимаете на нее?

У тебя есть это:

 lt;tdgt;lt;asp:Button ID="cmdLoadPDF" Text="Create PDF"   OnClientClick="doLoading();" runat="server" /gt;lt;/tdgt;    

итак, скажите это:

 lt;tdgt;lt;asp:Button ID="cmdLoadPDF" Text="Create PDF"   OnClientClick="doLoading(this);" runat="server" /gt;lt;/tdgt;  

и затем

 lt;scriptgt;  function doLoading(e) {  btn = $(e)  btn.hide()  // rest of your code here  }  lt;/scriptgt;  

Таким образом, эта панель обновления действительно будет вести себя как обратная запись целой страницы. Нажатие кнопки скроет панель обновления кнопки после возврата. Хруст Хруст Хруст, а затем, когда все будет готово, панель обновления вернется к клиенту и будет повторно загружена-и эта повторная загрузка также снова отобразит кнопку!!!

Итак, просто передайте «это» (кнопку) в процедуру js. скрыть кнопку — она будет оставаться скрытой до тех пор, пока не будет выполнен код, а когда появится новая свежая копия панели обновления — кнопка появится снова (скрытая настройка кнопки не сохраняется).

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

1. Это работает, спасибо.

2. То, что вы делаете, было бы лучше с JS на стороне клиента, чем с панелью обновления, как описал Альберт.

3. @SalikRafiq Я просто хотел избежать того, чтобы javascript был отключен и функция загрузки не работала. Но на самом деле это не так уж и важно.

4. Я бы не стал беспокоиться — есть группа, которая предполагает, что панели обновления плохие или их следует избегать. Я не согласен и считаю, что они являются одним из самых блестящих дополнений к веб-формам. И если вы посмотрите на недавние новые директивы blazer и page, они фактически создают систему, которая позволяет разработчикам легко обновлять только части страницы с помощью SignalR — огромного количества технологий для достижения той же легкости, которую мы получаем с панелями обновления. Так что не волнуйтесь, так как панели обновления также, как правило, экономят массу времени на написании JavaScript и использовании веб — методов-и в большинстве случаев получают столь же хорошие результаты.

5. Я думаю, что если javascript отключен, панели обновления тоже не будут работать? Пока ваша страница является легкой, панели обновления работают нормально. Помните, что состояние представления и элементы управления отправляются обратно — все это, а не только панель обновления, — а затем возвращаются и обрезаются. Просто не сходите с ума со своими страницами.