在我当前的设置中,当用户按下按钮时,它会运行特定的功能。在整个功能中,我想让用户通过向他们输出信息来了解功能的状态。在同一页面上,我有一个textarea。当我想更新用户时,我使用以下功能:
public static void appendToTextbox(System.Web.UI.HtmlControls.HtmlTextArea textArea, String message)
{
textArea.InnerText = textArea.InnerText + "\r\n" + message;
}
然而,这就产生了这样的问题:只有在所有处理完成后才真正更新textarea。我立即得到所有的消息,而不是一个一个,这真的打败了目的。我知道数据是服务器端的,我试图将信息推送到客户端,这可能需要某种类型的AJAX,但我不确定如何修改我的函数以准确更新textarea当我执行该功能时。
答案 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);
}
}
}
客户端将调用Register
和Unregister
方法,请求将它们包含在特定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
时,message
和value
参数都会发送到已注册特定processID
通知的已连接客户端,这将导致调用上面的客户端函数。 processID
的所有注册客户端都将收到消息并更新其显示,因此您可以让多个客户端显示相同的信息。
如果您之前没有使用过SignalR,我肯定会鼓励您尝试一下。你可以用它做很多有趣的事情。