使用c#代码,我在网页上有一个按钮,它将运行PowerShell进程(参见下面的代码)。此过程需要一段时间才能运行,因此当我单击按钮时,我想在标签中显示一条消息,指出该进程正在运行。然后,一旦该过程完成,更改标签消息以声明该过程已完成。我目前的代码是:
protected void button_Click(object sender, EventArgs e)
{
label.Text = "Running Process...";
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"powershell.exe";
startInfo.Arguments = @"C:\PowerShell\script.ps1";
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
label.Text = "Finished Process. ";
}
这当前不会显示"正在运行的进程..."的初始消息。它只是贯穿整个代码并显示"完成过程"消息。
所以我需要一种方法来提交第一行代码来填充标签,然后转到其余的代码但是我不知道如何做到这一点???
感谢任何帮助。
乔纳森。
答案 0 :(得分:1)
您可以使用AJAX来完成此操作。
您可以使用jquery / ajax发布它,在流程开始时设置您想要的消息,并在流程结束时完成消息。
答案 1 :(得分:0)
Aspx代码
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
<script type="text/javascript">
function BeginProcess() {
// Create an iframe.
var iframe = document.createElement("iframe");
// Point the iframe to the location of
// the long running process.
iframe.src = "Process.aspx";
// Make the iframe invisible.
iframe.style.display = "none";
// Add the iframe to the DOM. The process
// will begin execution at this point.
document.body.appendChild(iframe);
// Disable the button and blur it.
document.getElementById('trigger').blur();
}
function UpdateProgress(PercentComplete, Message) {
document.getElementById('ContentPlaceHolder2_lbDownload').setAttribute("disabled", "true");
document.getElementById('trigger').value = PercentComplete + '%: ' + Message;
}
</script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<input type="submit" value="Start BackUp Process!"
id="trigger" onclick="BeginProcess(); return false;"
style="width: 250px;" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1"
AssociatedUpdatePanelID="UpdatePanel1" runat="server">
<ProgressTemplate>
</ProgressTemplate>
</asp:UpdateProgress>
</asp:Content>
.cs代码背后的代码
public partial class Process : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
StringBuilder SB = new StringBuilder();
// Padding to circumvent IE's buffer.
Response.Write(new string('*', 256));
Response.Flush();
// Initialization
UpdateProgress(0, "Initializing task.");
try
{
foreach (yourloophere)
{
UpdateProgress(increment, db.Name + " Backup Started....");
//your process code
UpdateProgress(increment, db.Name + " Backup Completed!");
//您的流程代码 SB.Append(db.Name +&#34; BackUp Complted!&#34;);
//your process code
SB.Append("<br/>");
}
// All finished!
UpdateProgress(100, "All Database BackUp Completed!");
}
catch (Exception ex)
{
UpdateProgress(0, "Exception: " + ex.Message);
SB.Append("Back Up Failed!");
SB.Append("<br/>");
SB.Append("Failed DataBase: " + DBName);
SB.Append("<br/>");
SB.Append("Exception: " + ex.Message);
}
}
protected void UpdateProgress(double PercentComplete, string Message)
{
// Write out the parent script callback.
Response.Write(String.Format("<script type=\"text/javascript\">parent.UpdateProgress({0}, '{1}');</script>", PercentComplete, Message));
// To be sure the response isn't buffered on the server.
Response.Flush();
}
}
答案 2 :(得分:0)
看看asp生命周期。您无法通过服务器端代码更改页面而不进行回发。这就是你点击asp按钮等时所做的事情。
如果要显示加载指示器,则必须在运行长时间运行的代码之前创建它。否则,指示器将永远不会显示给用户,因为他没有收到新页面。
这里你有2个选项 - 做回发放置加载指示器并做另一个回发(我不建议)或只是通过JS显示一些东西。
<强> I created a Weave to show you the basic functionality. 强> - 从http://oracleinsights.blogspot.de/2009/12/how-to-create-loading-indicator_13.html
被盗这将显示加载指示器服务器端代码正在运行。
答案 3 :(得分:0)
您可以尝试添加内联JavaScript代码来更改标签。
<asp:Button ID="button" runat="server" OnClick="button_Click" Text="Click"
OnClientClick="this.value = 'Running Process...'" />
当您点击该按钮时会出现,然后重新加载页面时标签将更改为Finished Process.
。
答案 4 :(得分:0)
您可以在ajax上执行此操作,
function ShowProcessing()
{
$('#label').text('Running Process...');
// call pagemethod with your functionality
// Let's success callback is OnSuccess
}
function OnSuccess()
{
$('#label').text('Finished Process.');
}