ASP.NET在另一个客户端上更新UpdatePanel

时间:2011-08-18 09:25:51

标签: c# .net asp.net updatepanel

好。 所以基本上我正在研究网页上的消息系统。 我的网页上的用户能够发送彼此的消息,但现在我希望消息在发送时在接收器屏幕上“弹出”。就像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()中的代码以运行来自DB的消息,我可以看到消息被调用正常,并且加载了新消息。刚刚没有更新到UpdatePanel。 所以我一直在思考为什么更新面板在数据更新时没有在“接收器”端更新,我的结论是因为在“接收器”端没有部分回发。是的,Update()方法被调用,但没有回发。所以我的问题是: 是否有可能从代码隐藏中“强制”部分帖子?或者是否有其他可能更好的解决方案?

希望有道理: - )

4 个答案:

答案 0 :(得分:1)

帮助自己,使用SignalR构建整个事物。它是用于.NET服务器和浏览器之间实时通信的库(包括客户端库)。

如果你坚持这样做,你应该使用timer来触发更新面板更新

答案 1 :(得分:0)

我不是使用updatepanels的忠实粉丝,但我认为你可以使用timer-control来强制部分回发。

查看:http://mattberseth.com/blog/2007/08/using_the_ajax_timer_control_a.html

答案 2 :(得分:0)

我不是专家,但您可以尝试与SetTimeout(.svc)关联的Javascript / Jquery WebService函数来定期从客户端请求并从服务器检索数据。< / p>

答案 3 :(得分:0)

那些解决方案,彗星等会起作用,但最好的办法是使用socket.io Real Time Browser Applications 你也可以把它与backbone.js结合起来,并有一个非常好的应用程序。我帮助基于这些2创建了一个实时网络信使。