繁体   English   中英

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

[英]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()方法,但是没有回发。 所以我的问题是:是否可以从代码后面“强制”部分帖子? 还是有另一个更好的解决方案?

希望有道理:-)

帮自己一个忙,并使用SignalR构建整个组件 它是用于服务器与.NET浏览器之间实时通信的库(包括客户端库)。

如果您坚持使用硬方法,则应该使用计时器来触发更新面板更新

我不是使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM