#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 отключен, панели обновления тоже не будут работать? Пока ваша страница является легкой, панели обновления работают нормально. Помните, что состояние представления и элементы управления отправляются обратно — все это, а не только панель обновления, — а затем возвращаются и обрезаются. Просто не сходите с ума со своими страницами.