更新面板 update() 方法不起作用,如何在函数内强制刷新页面
Update Panel update() method not working, how to force refresh of page within function
我正在编写一个使用 SelectPDF 库加载 PDF 的页面。我 运行 遇到的问题是渲染 PDF 的加载时间。从 HTML.
渲染 PDF 大约需要 2-3 秒
这不是问题,但我想在加载期间禁用用于创建 pdf 的按钮。因为如果用户不耐烦并再次单击该按钮,该过程将重新开始。
我认为使用脚本管理器和更新面板可以让我做到这一点,但我似乎无法弄明白。我有部分页面呈现和更新模式设置为条件,但是当我从我的代码调用 update() 方法时,没有任何反应。在 PDF 完成呈现之前,该按钮不会禁用。
我想在 PDF 开始呈现之前强制更新按钮启用状态,而不是之后。
这是我的代码
ASPX 页面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" type="text/css" href="main.css" />
</head>
<body>
<form id="frmMain" runat="server">
<asp:ScriptManager ID="smMain" EnablePartialRendering="true" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="upMain" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<table id="form">
<tr>
<td>Page Header: </td>
<td><asp:TextBox ID="txtPageHeader" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>Page Content: </td>
<td><asp:TextBox ID="txtPageContent" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td></td>
<td><asp:Button ID="cmdLoadPDF" Text="Create PDF" OnClientClick="doLoading();" runat="server" /></td>
</tr>
<tr>
<td><asp:Label ID="lblLoading" Text="Loading" Visible="false" runat="server"></asp:Label></td>
</tr>
</table>
<iframe id="ifPDF" visible="false" runat="server"></iframe>
</ContentTemplate>
<Triggers>
</Triggers>
</asp:UpdatePanel>
</form>
</body>
</html>
还有我的 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;
}
}
如果你们能帮助我,我将不胜感激。
为什么不在单击按钮时隐藏或禁用该按钮?
你有这个:
<td><asp:Button ID="cmdLoadPDF" Text="Create PDF"
OnClientClick="doLoading();" runat="server" /></td>
所以,这样说:
<td><asp:Button ID="cmdLoadPDF" Text="Create PDF"
OnClientClick="doLoading(this);" runat="server" /></td>
然后
<script>
function doLoading(e) {
btn = $(e)
btn.hide()
// rest of your code here
}
</script>
因此,该更新面板的行为实际上将像整个页面一样 post-back。单击按钮将隐藏按钮 - 更新面板 post-back。 Crunch Crunch Crunch,然后完成后,更新面板将返回客户端并重新加载 - 重新加载也会重新显示按钮!!!
因此,只需将“this”(按钮)传递给 js 例程即可。隐藏按钮 - 它将保持隐藏状态,直到后面的代码完成,并且当更新面板的新副本返回时 - 按钮将再次显示(按钮的隐藏设置不会持续存在)。
我正在编写一个使用 SelectPDF 库加载 PDF 的页面。我 运行 遇到的问题是渲染 PDF 的加载时间。从 HTML.
渲染 PDF 大约需要 2-3 秒这不是问题,但我想在加载期间禁用用于创建 pdf 的按钮。因为如果用户不耐烦并再次单击该按钮,该过程将重新开始。
我认为使用脚本管理器和更新面板可以让我做到这一点,但我似乎无法弄明白。我有部分页面呈现和更新模式设置为条件,但是当我从我的代码调用 update() 方法时,没有任何反应。在 PDF 完成呈现之前,该按钮不会禁用。
我想在 PDF 开始呈现之前强制更新按钮启用状态,而不是之后。
这是我的代码
ASPX 页面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" type="text/css" href="main.css" />
</head>
<body>
<form id="frmMain" runat="server">
<asp:ScriptManager ID="smMain" EnablePartialRendering="true" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="upMain" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<table id="form">
<tr>
<td>Page Header: </td>
<td><asp:TextBox ID="txtPageHeader" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>Page Content: </td>
<td><asp:TextBox ID="txtPageContent" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td></td>
<td><asp:Button ID="cmdLoadPDF" Text="Create PDF" OnClientClick="doLoading();" runat="server" /></td>
</tr>
<tr>
<td><asp:Label ID="lblLoading" Text="Loading" Visible="false" runat="server"></asp:Label></td>
</tr>
</table>
<iframe id="ifPDF" visible="false" runat="server"></iframe>
</ContentTemplate>
<Triggers>
</Triggers>
</asp:UpdatePanel>
</form>
</body>
</html>
还有我的 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;
}
}
如果你们能帮助我,我将不胜感激。
为什么不在单击按钮时隐藏或禁用该按钮?
你有这个:
<td><asp:Button ID="cmdLoadPDF" Text="Create PDF"
OnClientClick="doLoading();" runat="server" /></td>
所以,这样说:
<td><asp:Button ID="cmdLoadPDF" Text="Create PDF"
OnClientClick="doLoading(this);" runat="server" /></td>
然后
<script>
function doLoading(e) {
btn = $(e)
btn.hide()
// rest of your code here
}
</script>
因此,该更新面板的行为实际上将像整个页面一样 post-back。单击按钮将隐藏按钮 - 更新面板 post-back。 Crunch Crunch Crunch,然后完成后,更新面板将返回客户端并重新加载 - 重新加载也会重新显示按钮!!!
因此,只需将“this”(按钮)传递给 js 例程即可。隐藏按钮 - 它将保持隐藏状态,直到后面的代码完成,并且当更新面板的新副本返回时 - 按钮将再次显示(按钮的隐藏设置不会持续存在)。