[英]ASP.NET Updating a UpdatePanel on another client
好的。 所以基本上我在网页上的消息系统上工作。 我网页上的用户可以互相发送消息,但是现在我希望消息在发送时在接收者屏幕上“弹出”。 就像当您在线上Facebook上的某人向您发送消息时,消息内容变成红色。 为了解决我的问题,我需要每个客户知道当前还有哪些其他客户在线。 我已经通过在Global.asax中编写类似于Observer的模式来解决了这个问题:
public static void AddObserver(Observer o)
{
if(!observers.Contains(o))
observers.Add(o);
System.Diagnostics.Debug.WriteLine("Observer tilføjet : " + observers.Count);
}
public static void RemoveObserver(Observer o)
{
if (observers.Contains(o))
observers.Remove(o);
System.Diagnostics.Debug.WriteLine("Observer fjernet : " + observers.Count);
}
public static void NotifyObserversNewMail(Observer observer)
{
foreach (Observer o in observers)
if(!o.Equals(observer))
o.UpdateNewMail();
}
在这种情况下,观察者只是我的Site.Master,它使Observer类扩展:
public partial class SiteMaster : System.Web.UI.MasterPage, Observer
{
protected void Page_Unload(object sender, EventArgs e)
{
Session["observer"] = this;
Global.AddObserver(this);
}
protected void Page_Load(object sender, EventArgs e)
{
//ADD OBSERVER TO GLOBAL.ASAX
if (Session["observer"] != null)
Global.RemoveObserver((Observer)Session["observer"]);
public void Update()
{
DLMessages.DataSource = ServiceMessages.GetInstance().GetMessages();
DLMessages.DataBind();
UPMessages.Update();
}
其中DLMessages是UpdatePanel UPMessages内部的DataList。
因此,我们有一个“发送者”客户端和一个“接收者”客户端。 发件人创建新消息时,将调用此方法:
protected void MessageSend(object source, EventArgs args)
{
Page.Validate("ValGroupMessageTo");
if (Page.IsValid)
{
ServiceMessages.GetInstance().SendMessage(ServiceCommunity.GetInstance().GetUser(MessageTo.Text).Id, ((User)Session["user"]).Id, MessageMessage.Text);
Global.NotifyObserversNewMail((Observer)Session["observer"]);
ClosePopups(new object(), new EventArgs());
Update();
}
}
您可能会注意到,它在global.asax上调用了Notify,并在其自身上直接调用了update()。 “发送者”端的UpdatePanel可以完美更新,但是在接收者端则什么也没有发生。 反正不在UpdatePanel中。 原因是,如果我更改Update()中的代码以遍历数据库中的消息,则可以看到该消息被调用,并且新消息已加载。 只是没有更新到UpdatePanel。 因此,我一直在思考为什么当数据被更新时,updatepanel不会在“接收者”那一侧得到更新,而我的结论是,这是因为在“接收者”那一侧没有部分回发。 是的,可以调用Update()方法,但是没有回发。 所以我的问题是:是否可以从代码后面“强制”部分帖子? 还是有另一个更好的解决方案?
希望有道理:-)
我不是使用updatepanels的忠实粉丝,但是我认为您可以使用timer-control强制执行部分回发。
看看: http : //mattberseth.com/blog/2007/08/using_the_ajax_timer_control_a.html
我不是专家,但是您可以尝试与WebService
(.svc)关联的Javascript / Jquery SetTimeout
函数,以从客户端发出定期请求并从服务器检索数据。
这些解决方案,彗星等都可以使用,但实际上最好的选择是使用socket.io 实时浏览器应用程序。您也可以将其与ribs.js结合使用,并拥有一个非常不错的应用程序。 我基于这些2.帮助制作了一个实时网络Messenger。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.