处理时更新TextArea

时间:2015-11-27 03:23:15

标签: c# asp.net

在我当前的设置中,当用户按下按钮时,它会运行特定的功能。在整个功能中,我想让用户通过向他们输出信息来了解功能的状态。在同一页面上,我有一个textarea。当我想更新用户时,我使用以下功能:

public static void appendToTextbox(System.Web.UI.HtmlControls.HtmlTextArea textArea, String message)
{
     textArea.InnerText = textArea.InnerText + "\r\n" + message;
}

然而,这就产生了这样的问题:只有在所有处理完成后才真正更新textarea。我立即得到所有的消息,而不是一个一个,这真的打败了目的。我知道数据是服务器端的,我试图将信息推送到客户端,这可能需要某种类型的AJAX,但我不确定如何修改我的函数以准确更新textarea当我执行该功能时。

1 个答案:

答案 0 :(得分:0)

这样的客户端通知不是由ASP.NET框架直接处理的,而是可以使用SignalR等工具轻松实现。

SignalR允许您与可用作双向消息管道的客户端浏览器(或其他应用程序)建立连接。客户端可以在服务器上调用方法,反之亦然。

如果是进度通知,您的客户端将通过调用SignalR集线器上的方法来请求通知。当您的流程想要将信息反馈给客户端时,它会调用通知客户端的服务器端代码,并在每个侦听客户端调用JavaScript方法。

以下是SignalR进度中心的一些示例代码:

using System;
using System.Web;
using Microsoft.AspNet.SignalR;

namespace ProjectNamespace
{
    public class ProgressHub : Hub
    {
        public Task Register(string processID)
        {
            return Groups.Add(Context.ConnectionId, processID);
        }

        public Task Unregister(string processID)
        {
            return Groups.Remove(Context.ConnectionId, processID);
        }
    }
}

客户端将调用RegisterUnregister方法,请求将它们包含在特定processID的通知中。这将由您的代码生成,该代码从流程开始,传递给客户端,然后通过SignalR中心注册兴趣。

在客户端,您将拥有一个包含以下内容的脚本:

// register a function that can be called by the server 
$.connection.progressHub.client.updateProgress = function (mesage, value) {
        $("div.progress").text(message + ": " + value);
    }

// invoke the 'Register' method on the hub
$.connection.progressHub.server.register("process_1234");

向客户端发送消息,听取任何特定的processID:

public static class Progress
{
    public static void Notify(string processID, string message, float value)
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ProgressHub>();
        context.Clients.Group(processID).updateProgress(message, value);
    }
}

每当您致电Progress.Notify时,messagevalue参数都会发送到已注册特定processID通知的已连接客户端,这将导致调用上面的客户端函数。 processID的所有注册客户端都将收到消息并更新其显示,因此您可以让多个客户端显示相同的信息。

如果您之前没有使用过SignalR,我肯定会鼓励您尝试一下。你可以用它做很多有趣的事情。