我有一个可以进行ajax调用的按钮。
<%@ Page Language="C#" MasterPageFile="~/pj.master" AutoEventWireup="true" CodeFile="refreshData.aspx.cs" Inherits="Admin_refreshData" EnableEventValidation="false" %>
<%@ MasterType VirtualPath="~/pj.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
<asp:ScriptManager ID="scriptManager1" runat="server"></asp:ScriptManager>
<script type="text/javascript">
function checkSubmit()
{
if (confirm('Are you sure you want to refresh the data?')) {
//Disable our button
$('#<%: butSubmit.ClientID %>').attr("disabled", true);
<%= ClientScript.GetPostBackEventReference(butSubmit, string.Empty) %>;
$.ajax({
error: function (data) {
//The Ajax request was a failure.
alert('Fail to call batch job.');
},
success: function (data) {
$('#<%: lblMsg.ClientID %>').text('Batch job running. Please kindly wait.');
},
complete: function () {
}
});
}
else
return false;
}
</script>
<h1>Refresh Data</h1>
<asp:Panel ID="PnlSearch" runat="server">
<asp:UpdatePanel ID="updtPnlRefresh" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<table border="0" style="width: 100%">
<tr>
<td>
Refresh Data: <asp:Button ID="butSubmit" runat="server" Text="Refresh" OnClientClick="return checkSubmit()" UseSubmitBehavior="false" OnClick ="butSubmit_Click" />
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblMsg" runat="server"></asp:Label>
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
</asp:Content>
然后在我的后端,当单击"提交"按钮时,它将启动另一个耗时的过程。因此,我将这个过程分为另一个任务。然后完成任务后,我想更新结果。但这似乎不起作用。
代码背后:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void butSubmit_Click(object sender, EventArgs e)
{
new System.Threading.Tasks.Task(RunBatchJob).Start();
lblMsg.Text = "Batch job running. Please kindly wait.";
butSubmit.Enabled = false;
}
private void RunBatchJob()
{
string path = @"D:CodesRefreshData.exe";
Master.RemoveErrorMessage();
if (File.Exists(path))
{
Process process = new Process();
process.StartInfo.FileName = path;
process.Start();
process.WaitForExit();
int result = process.ExitCode;
if (result == 0)
Master.AddSuccessMessage("Batch job successfully run.");
else
Master.AddErrorMessage("Batch job failed to run properly.");
}
else
{
Master.AddErrorMessage("Batch job file not found.");
}
lblMsg.Text = "";
butSubmit.Enabled = true;
}
因此,当过程完成后,我想删除状态文本并启用按钮。但是它仍然存在,并且该按钮仍然被禁用。
如何解决此问题?
您可以使用SignalR将更改推回客户端。它将自动选择最有效的协议(即Websocket,长期填写等)
启动任务时,将条目放在表中,然后将主键返回客户端。客户可以使用计时器继续进行轮询,以查看表格中是否已更改并采取适当的措施。
要检索您可能必须在页面中公开新代码的状态。