C# 如何在ajax请求中更新状态标签

C# 如何在ajax请求中更新状态标签,c#,asp.net,html,ajax,webforms,C#,Asp.net,Html,Ajax,Webforms,我有以下代码: <div style="padding: 0px 12px 12px 12px;"> <asp:UpdatePanel runat="server" ID="Panel"> <ContentTemplate> <asp:Button ID="btnGenerate" CssClass="button" Style="float: right" runat="server"

我有以下代码:

<div style="padding: 0px 12px 12px 12px;">
    <asp:UpdatePanel runat="server" ID="Panel">
        <ContentTemplate>
            <asp:Button ID="btnGenerate" CssClass="button" Style="float: right" runat="server"
                Text="Go" OnClick="btnGenerate_Click" />
        </ContentTemplate>
    </asp:UpdatePanel>
</div>
<div>
    <asp:UpdateProgress runat="server" ID="PageUpdateProgress">
        <ProgressTemplate>
            <img src="ajax-loader.gif" />
            <asp:Label ID="lblStatus" runat="server" Text="Working..." CssClass="label" />
        </ProgressTemplate>
    </asp:UpdateProgress>
</div>
它给出了某种名称空间问题。你知道我该怎么做吗

更新:
错误是“找不到类型或命名空间“lblStatus”。

如果要动态更改,请使用以下代码

创建一个如下所示的函数

function ChangeUpdateProgress(message)
{  
  document.getElementById('lblStatus').innerText=message;
}
调用事件的函数
OnClick

<asp:LinkButton ID="btnUpdate" runat="server"Text="Update" OnClientClick="ChangeUpdateProgress('Please wait Updating....')" OnClick="btnUpdate_Click"></asp:LinkButton>

<asp:LinkButton ID="btnAdd" runat="server" OnClientClick="ChangeUpdateProgress('Please wait Adding....')" OnClick="btnAdd_Click"></asp:LinkButton>


希望这对您有所帮助。

如果您想动态更改,请使用以下代码

创建一个如下所示的函数

function ChangeUpdateProgress(message)
{  
  document.getElementById('lblStatus').innerText=message;
}
调用事件的函数
OnClick

<asp:LinkButton ID="btnUpdate" runat="server"Text="Update" OnClientClick="ChangeUpdateProgress('Please wait Updating....')" OnClick="btnUpdate_Click"></asp:LinkButton>

<asp:LinkButton ID="btnAdd" runat="server" OnClientClick="ChangeUpdateProgress('Please wait Adding....')" OnClick="btnAdd_Click"></asp:LinkButton>


希望这对您有所帮助。

由于您无法直接执行此操作,因此代码将非常复杂

ASP.NET AJAX请求的体系结构是在请求完成之前不会返回任何内容。这就给您留下了几个不同的选项,包括:-

1) 将操作拆分为多个加载,自动重新部分过帐以执行下一个加载并更新标签

2) 在服务器上的单独进程中运行该操作(例如,使用EXE),并在计时器上执行定期部分回发,以与服务器上的EXE通信,获取当前状态并更新标签


3) 在iframe中的页面中运行任务并使用Response.Write在关闭缓冲的情况下更新iframe(或在每次状态更新后至少刷新一次)

此代码将非常复杂,因为您无法直接执行此操作

ASP.NET AJAX请求的体系结构是在请求完成之前不会返回任何内容。这就给您留下了几个不同的选项,包括:-

1) 将操作拆分为多个加载,自动重新部分过帐以执行下一个加载并更新标签

2) 在服务器上的单独进程中运行该操作(例如,使用EXE),并在计时器上执行定期部分回发,以与服务器上的EXE通信,获取当前状态并更新标签


3) 在iframe中的页面中运行任务,并使用Response.Write在关闭缓冲的情况下更新iframe(或在每次状态更新后至少刷新)

要显示状态,您需要两个不同的AJAX调用,一个是当前和主要的调用,实际执行任务,另一个只是检查当前状态,返回一条非常简单的消息

//Changes the HTML like this
<asp:UpdateProgress runat="server" ID="PageUpdateProgress">
    <ProgressTemplate>
        <span id="currentStatu"></span> <img src="ajax-loader.gif" />
    </ProgressTemplate>
</asp:UpdateProgress>

//Javascript
setInterval(jQuery.get(page.aspx?status=1, function () { $("#currentStatu").text(data); } ), 500); // every 0.5 second.
//像这样更改HTML
//Javascript
setInterval(jQuery.get(page.aspx?status=1,函数(){$(“#currentStatu”).text(data);}),500);//每0.5秒。
棘手的部分是如何从服务器端获取当前状态。如果您可以将其保留在会话中,那么当请求[“status”]=“1”时,这将是最简单的方法,只需将此会话作为文本返回,其他内容都不需要,就可以完成

另一方面,您也可以查询数据库以获取当前状态


我希望这会有所帮助。

要显示状态,您需要两个不同的AJAX调用,一个是当前的和主要的调用,它实际完成了任务,另一个只是检查当前状态,返回一条非常简单的消息

//Changes the HTML like this
<asp:UpdateProgress runat="server" ID="PageUpdateProgress">
    <ProgressTemplate>
        <span id="currentStatu"></span> <img src="ajax-loader.gif" />
    </ProgressTemplate>
</asp:UpdateProgress>

//Javascript
setInterval(jQuery.get(page.aspx?status=1, function () { $("#currentStatu").text(data); } ), 500); // every 0.5 second.
//像这样更改HTML
//Javascript
setInterval(jQuery.get(page.aspx?status=1,函数(){$(“#currentStatu”).text(data);}),500);//每0.5秒。
棘手的部分是如何从服务器端获取当前状态。如果您可以将其保留在会话中,那么当请求[“status”]=“1”时,这将是最简单的方法,只需将此会话作为文本返回,其他内容都不需要,就可以完成

另一方面,您也可以查询数据库以获取当前状态


我希望它能有所帮助。

你不能用.net更新面板来实现这一点,至少我认为这并不容易。尽管您可以通过两个单独的AJAX调用来实现

本例使用JQuery实现AJAX,代码在vb.net中

基本上,您需要做的是第一次调用以开始长流程,然后重复进行第二次调用,使用第二种方法获取长流程的状态

阿贾克斯

这是你对漫长过程的主要呼吁。如果需要,您需要将数据传递给方法。请注意,有一个processName。这应该是一个排序的随机字符串,以确保您只获得此进程的状态。其他用户将使用不同的随机进程名,这样您就不会混淆状态

    var processName = function GenerateProcessName() {

        var str = "";
        var alhpabet = "abcdefghijklmnopqrstuvwxyz";
        for (i = 1; i < 20; i++) {
            str += alhpabet.charAt(Math.floor(Math.random() * alhpabet.length + 1));
        }
        return str;
    }


    function StartMainProcess(){
    $j.ajax({
            type: "POST",
            url: "/MyWebservice.asmx/MyMainWorker",
            data: "{'processName' : '" + processName + "','someOtherData':'fooBar'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                if (msg.d) {                        
                    // do a final timerPoll - process checker will clear everything else
                    TimerPoll();
                }
            }
        });
        TimerPoll();
     }
最后,GetProgress()函数用于获取进度。我们必须传入与上面使用的相同的processName,以便仅获取此用户调用的进程

function GetProgress() {
        // make the ajax call
        $j.ajax({
            type: "POST",
            url: "/MyWebService.asmx/MyMainWorkerProgress",
            data: "{'processName' : '" + processName + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {

                // Evaulate result..
                var process = msg.d

                if (process.processComplete) {
                    // destroy the timer to stop polling for progress
                    clearTimeout(timer);

            // Do your final message to the user here.                      

                } else {

                   // show the messages you have to the user.
                   // these will be in msg.d.messages

                    // poll timer for another trip
                    TimerPoll();
                }
        });

    }
现在,在后端,您将有两个与AJAX通信的web方法。您还需要一个共享/静态对象来保存所有进度信息,以及您想要传递回用户的任何内容

在我的例子中,我创建了一个类,该类的属性已填充,并在每次调用MyMainWorkerProcess时传递回来。这看起来有点像这样

    Public Class ProcessData
        Public Property processComplete As Boolean
        Public Property messages As List(Of String) = New List(Of String)
    End Class
我也有一个使用这个类的共享属性,它看起来像。。。(此共享属性能够由多个用户保存多个进程进程-因此是字典。字典的键将是进程名称。所有进程数据都将在ProcessData类中。)

Private Shared processProgress As Dictionary(Of String, ProcessData) = New Dictionary(Of String, ProcessData)
我的主要辅助函数看起来有点像这样。请注意,我们首先要确保没有另一个processProgress使用相同的函数

<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
Public Function MyMainWorker(ByVal processName as string, ByVal SomeOtherData as string) as Boolean

        '' Create progress object - GUI outputs process to user
        '' If the same process name already exists - destroy it
        If (FileMaker.processProgress.ContainsKey(processName)) Then
            FileMaker.processProgress.Remove(processName)
        End If

        '' now create a new process
        dim processD as ProcessData = new ProcessData() with {.processComplete = false}


        '' Start doing your long process.

        '' While it's running and after whatever steps you choose you can add messages into the processData which will be output to the user when they call for the updates
         processD.messages.Add("I just started the process")

         processD.messages.Add("I just did step 1 of 20")

         processD.messages.Add("I just did step 2 of 20 etc etc")

         '' Once done, return true so that the AJAX call to this method knows we're done..
        return true

End Function
_
_
作为布尔值的公共函数MyMainWorker(ByVal processName作为字符串,ByVal SomeOtherData作为字符串)
“”创建进度对象-GUI向用户输出进程
“”如果已存在相同的进程名称-销毁它
如果是(FileMaker.processProgress.ContainsKey(processName)),则
FileMaker.processProgress.Remove(processName)
如果结束
“”现在创建一个新进程
dim processD as ProcessData=new ProcessData(),带{.processComplete=false}
“”开始执行您的长流程。
“”在运行时以及在您选择的任何步骤之后,您都可以将消息添加到processData w中