【问题标题】:ASP.NET Updating a UpdatePanel on another clientASP.NET 在另一个客户端上更新 UpdatePanel
【发布时间】:2011-08-18 09:25:51
【问题描述】:

好的。 所以基本上我正在网页上的消息系统上工作。 我网页上的用户能够互相发送消息,但现在我希望消息在发送时在接收者屏幕上“弹出”。就像 Facebook 上的某个人在您在线时向您发送消息一样,消息会变成红色。为了解决我的问题,我需要每个客户都知道目前还有哪些其他客户在线。我通过在 Global.asax 中编写类似观察者的模式解决了这个问题:

    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,我已经扩展了观察者类:

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 更新完美,但接收端没有任何反应。反正不在更新面板中。 因为如果我更改 Update() 中的代码以运行来自 DB 的消息,我可以看到消息被正常调用,并且新消息被加载。只是没有更新到 UpdatePanel。 所以我一直在思考为什么更新面板在数据更新时不会在“接收者”端更新,我的结论是这是因为“接收者”端没有部分回发。是的,当然,Update() 方法被调用,但没有回发。所以我的问题是这样的: 是否可以从代码隐藏中“强制”返回部分帖子?还是有其他更好的解决方案?

希望它有意义:-)

【问题讨论】:

  • 您是在尝试将更新从服务器推送到客户端,而没有客户端请求,还是我弄错了?
  • 这正是我想要做的......不可能?
  • 据我所知。因为客户端不像服务器,它一直在等待请求。客户端发出请求并仅等待响应。
  • 因此,例如,当 facebook 使用他们的消息系统执行此操作时,他们有些让客户要求更新?也许在计时器上……?
  • 很可能,使用 Javascript/AJAX。

标签: c# .net asp.net updatepanel


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我不太喜欢使用更新面板,但我认为您可以使用计时器控件来强制执行部分回发。

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

    【讨论】:

      【解决方案3】:

      这些解决方案,彗星等都可以,但实际上你最好的选择是使用 socket.io Real Time Browser Applications 您还可以将它与backbone.js 结合起来,并拥有一个非常好的应用程序。我帮助制作了基于这 2 个的实时网络信使。

      【讨论】:

      • 在 .NET 世界中 - SignalR :)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-05
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多