通过单击表单上的c#asp.net按钮,如何在继续下一行代码之前执行一行代码?

时间:2014-08-21 10:59:24

标签: c# asp.net

使用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. ";

      }

这当前不会显示"正在运行的进程..."的初始消息。它只是贯穿整个代码并显示"完成过程"消息。

所以我需要一种方法来提交第一行代码来填充标签,然后转到其余的代码但是我不知道如何做到这一点???

感谢任何帮助。

乔纳森。

5 个答案:

答案 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.');
}