信号R没有更新

时间:2016-01-21 16:47:54

标签: asp.net-mvc signalr signalr-hub signalr.client

我需要显示管理员发送的通知。

我的菜单只会加载一次。

我还有广播通知页面,我会向其他人发送通知。点击使用Hub的保存按钮我将消息发送给客户端。

这里我的未读消息计数(就像我们在fb中一样)放在布局中。

我的所有发送和接收代码都在广播通知页面中。通知计数未显示在布局菜单上(如fb)。

会出现什么问题。?

计数在管理员将发送通知的网页上更新。其他页面说主页或任何其他页面布局中的通知计数未得到更新。

对此我的回答对我很有帮助。

集线器类:点击按钮我正在调用此集线器方法

    public void BroadcastNotifications(string message)
    {
        // Save data to database 
        Utility.AddNotification(message);
        // Call method to get the number of unread messages (consider the status = read / unread)
        int UnreadCount = Utility.getUnreadMessageCount();
        UnreadCount = 12;
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<BroadcastMessage>();
        context.Clients.All.receiveNotification(message, UnreadCount);

    }

管理页面,其中将发送通知消息。

    @using (Html.BeginForm()) 
    {
        @Html.ValidationSummary(true)

        <fieldset>
            <legend>Notification</legend>

            <div class="editor-label">
                @Html.LabelFor(model => model.Message)
            </div>

            <p>
                <input type="button" id="button1" value="Create" />
            </p>
        </fieldset>
    }

    @section Scripts 
    {
        <script src="~/Scripts/jquery-1.11.3.js" type="text/javascript"></script>

        <script src="~/Scripts/jquery.signalR-1.1.4.js" type="text/javascript"></script>
        <script src="~/signalr/hubs"></script>
        <script type="text/javascript">
            $(function () {
                $.connection.hub.logging = true;
                var proxy = $.connection.broadcastMessage;

                $.connection.hub.start().done(function () {
                    $('#button1').click(function () {
                        proxy.server.broadcastNotifications($("#Message").val());
                    });
                });
                proxy.client.receiveNotification = function (message, UnreadCount) {
                    **$("#notification_count").html(UnreadCount);
                    $("#notification_count").show();**
                };
                $.connection.hub.start();
            });
        </script>
    }

通知计数应显示的布局页面

    <li class="dropdown" id="notification_li">
        <a href="#" class="fa fa-globe fa-inverse dropdown-toggle" 
            data-canvas="body" style="color:gray;padding-top:17px" data-toggle="dropdown" 
            role="button" aria-haspopup="true" aria-expanded="false">
        <span id="**notification_count**" class="notification_count">0</span></a>
        <ul class="dropdown-menu" id="popup">
        </ul>
    </li>

This is the _layout page where i have to display the count of unread mesasges.
If i trigger the send button the unread count is getting updated on all the admin add notification open pages. But the other pages it remains empty.

根据评论更新了_Layout

我已将信号r客户端调用移至_layout

  <head>
    <meta charset="utf-8">
    <title>Services</title>

    <!-- Bootstrap core CSS -->
    @Styles.Render("~/Content/bootstrapcss")
    @Scripts.Render("~/bundles/modernizr")

    <script src="~/Scripts/jquery.signalR-1.1.4.js" type="text/javascript"></script>
    <script src="~/signalr/hubs"></script>
    <script type="text/javascript">
    $(function () {
        debugger;
        $.connection.hub.logging = true;
        var proxy = $.connection.broadcastMessage;

        proxy.client.receiveNotification = function (message, UnreadCount) {
            debugger;
            $("#notification_count").html(UnreadCount);
            $("#notification_count").show();
        };

        $.connection.hub.start();

        $.connection.hub.start().done(function () {
            $('#button1').click(function () {
                proxy.server.broadcastNotifications($("#Message").val());
            });
        });
    });
</script>
</head>
    <body>
    @Html.Partial("_RightMenu")
    **@Html.Partial("_TopMenu")  **//** Notificationcount span is in this partial view**
    <div class="container-fluid body-content">
        <div class="row" id="Content">@RenderBody()</div>
        <br />
        <br />
        <footer>
            <p>&copy; @DateTime.Now.Year - FOOTER</p>
        </footer>
    </div>
    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrapjs")
    @Scripts.Render("~/Scripts/abcjs")
    @RenderSection("scripts", required: false)
  </body>
</html>

我已按上述方式更新。在_Layout中有两个局部视图,其中我在一个局部视图上显示计数。这是正确的添加方式。

这是自动生成的信号r文件

    $.hubConnection.prototype.createHubProxies = function () {
        var proxies = {};
        this.starting(function () {
            registerHubProxies(proxies, true);
            this._registerSubscribedHubs();
        }).disconnected(function () {
            registerHubProxies(proxies, false);
        });
        proxies.broadcastMessage = this.createHubProxy('broadcastMessage'); 
        proxies.broadcastMessage.client = { };
        proxies.broadcastMessage.server = {
        broadcastNotifications: function (message) {
            return proxies.broadcastMessage.invoke.apply(proxies.broadcastMessage, $.merge(["BroadcastNotifications"], $.makeArray(arguments)));
        }
    };
        return proxies;
    };

    signalR.hub = $.hubConnection("/signalr", { useDefaultPath: false });
    $.extend(signalR, signalR.hub.createHubProxies());
}(window.jQuery, window));

1 个答案:

答案 0 :(得分:0)

我认为问题如下:您只是收到管理员的通知&#39;位点。

我会将中心脚本部分放在_layout中。

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")

<script src="~/Scripts/jquery.signalR-2.2.0.js" type="text/javascript"></script>
<script src="~/signalr/hubs"></script>
<script type="text/javascript">
    $(function () {
        debugger;
        $.connection.hub.logging = true;
        var proxy = $.connection.broadcastMessage;

        proxy.client.receiveNotification = function (message, UnreadCount) {
            debugger;
            $("#notification_count").html(UnreadCount);
            $("#notification_count").show();
        };

        $.connection.hub.start();

        $.connection.hub.start().done(function () {
            $('#button1').click(function () {
                proxy.server.broadcastNotifications($("#Message").val());
            });
        });
    });
</script>

@RenderSection("scripts", required: false)

<li class="dropdown" id="notification_li">
    <a href="#" class="fa fa-globe fa-inverse dropdown-toggle"
       data-canvas="body" style="color:gray;padding-top:17px" data-toggle="dropdown"
       role="button" aria-haspopup="true" aria-expanded="false">
        <span id="notification_count" class="notification_count">0</span>
    </a>
    <ul class="dropdown-menu" id="popup"></ul>
</li>

您可以查看我为案例创建的示例项目:

https://github.com/blfuentes/SignalR_StackOverflow_Question

我将nuget软件包更新到最新版本的SignalR 2.2.0