SignalR- Jquery:$ .connection.chathub返回undefined

时间:2017-09-30 03:10:05

标签: jquery asp.net-mvc asp.net-mvc-5 signalr-hub signalr-2

我正在使用Asp.net MVC,AngularJs,SignalR和Jquery创建聊天应用程序。 在聊天视图中,当我尝试设置聊天对象的值时,它传递空值,代码引用位于括号内(var chat = $。connection.chathub;)。因此,没有其他功能可行。 我在这个项目中使用“Microsoft.AspNet.SignalR.2.2.2”。和jquery和signalr相关的脚本,如'jquery.signalR-2.2.2.js,jquery-ui-1.12.1.js'以及其他一些jquery库。

任何人都可以帮助我吗?我附上了代码供您参考。

@section scripts{
    @*@Scripts.Render("~/Scripts/jquery-ui-1.12.1.min.js")
        @Scripts.Render("~/Scripts/jquery.signalR-2.2.2.min.js")*@

    <!--Reference the autogenerated SignalR hub script. -->
    <script src="~/signalr/hubs"></script>
    <script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>
    <script src="~/Scripts/jquery-ui-1.12.1.min.js"></script>

    <script type="text/javascript">


        $(function () {
            StartChat();
        });



        function StartChat() {
            alert('StartChat');
            var chat = $.connection.chathub;
            alert('chat : ' + $.connection.chathub);
            // Get logged in user
            $('#UserIn').val($('#LoggedInUser').val());
            chat.client.differentName = function (name) {
                return false;
                // Prompts for different user name
                $('#UserIn').val($('#LoggedInUser').val());
                chat.server.notify($('#UserIn').val(), $.connection.hub.id);
            };

            chat.client.online = function (name) {
                // Update list of users
                if (name == $('#UserIn').val())
                    $('#onlineusers').append('<div class="border" style="color:green">You: ' + name + '</div>');
                else {
                    $('#onlineusers').append('<div class="border">' + name + '</div>');
                    $("#users").append('<option value="' + name + '">' + name + '</option>');
                }
            };

            //
            chat.client.enters = function (name) {
                $('#chatlog').append('<div ><i>' + name + ' joins the conversation</i></div>');
                $("#users").append('<option value="' + name + '">' + name + '</option>');
                $('#onlineusers').append('<div class="border">' + name + '</div>');
            };

            // Create a function that the hub can call to broadcast chat messages.
            chat.client.broadcastMessage = function (name, message) {

                //display the message
                $('#chatlog').append('<div class="border"><span style="color:orange">' + name + '</span>: ' + message + '</div>');
            };

            chat.client.disconnected = function (name) {
                //Calls when someone leaves the page
                $('#chatlog').append('<div ><i>' + name + ' leaves the conversation</i></div>');
                $('#onlineusers div').remove(":contains('" + name + "')");
                $("#users option").remove(":contains('" + name + "')");
            };

            // start the connection
            $.connection.hub.start().done(function () {
                alert('Send button clicked : ' + $('#message').val());
                //Calls the notify method of the server
                chat.server.notify($('#UserIn').val(), $.connection.hub.id);

                $('#btnsend').click(function () {
                    alert('Send button clicked : ' + $('#message').val());
                    // Call the Send method on the hub.
                    chat.server.send($('#UserIn').val(), $('#message').val());


                    // Clear text box and reset focus for next comment.
                    $('#message').val('').focus();
                });
            })
        }
    </script>
}
@model ZupChatApp.Models.User
@{
    ViewBag.Title = "ChatRoomView";
}





@Html.Label("LoggedInUser", Model.FirstName, new { id = "" })
<h2>Zup Chat Room View</h2>
<div class="LeftContent">

    abcccc
</div>
<div class="CenterContent">
    <div id="container">
        <input type="hidden" id="nickname" />
        <div id="chatlog"></div>
        @*<div id="onlineusers">
                <b>Online Users</b>
            </div>*@
        <div id="chatarea">
            <div class="messagelog">
                <textarea spellcheck="true" id="message" class="messagebox"></textarea>
            </div>
            <div class="actionpane">
                <input type="button" id="btnsend" value="Send" class="btn btn-success col-md-offset-2 glyphicon-font" />
            </div>

        </div>
    </div>
</div>
<div></div>

2 个答案:

答案 0 :(得分:1)

This is probably an issue with the casing of chathub. From the "Getting Started with SignalR 2" documentation

  

在JavaScript中,对服务器类及其成员的引用是以camel为例。代码示例将JavaScript中的C#ChatHub类引用为chatHub

所以,将其改为

var chat = $.connection.chatHub;

此外,应在<script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>

之前添加<script src="~/signalr/hubs"></script>引用

答案 1 :(得分:1)

您应该始终使用sample from Microsoft的精确副本。不只是页面而是整个解决方案。让示例解决方案正常运行。

对于您不熟悉的任何技术都是如此。然后开始一次修改一件事来达到你的安排。

而且,这是我的页面(不久前)。比较并看看有什么不同:

@section scripts {
  <!--Reference the SignalR library. -->
  <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
  <!--Reference the autogenerated SignalR hub script. -->
  <script src="~/signalr/hubs"></script>

  <!--Add script to update the page and send messages.-->
  <script type="text/javascript">
    $(function () {
      // Declare a proxy to reference the hub.
      var chat = $.connection.chatHub;
      // Create a function that the hub can call to broadcast messages.
      chat.client.broadcastMessage = function (customMessage) {
        // Html encode display name and message.
        var encodedName = $('<div />').text(customMessage.UserName).html();
        var encodedMsg = $('<div />').text(customMessage.Message).html();
        // Add the message to the page.
        $('#discussion').append('<li><strong>' + encodedName
            + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
      };
      // Get the user name and store it to prepend to messages.
      $('#displayname').val(prompt('Enter your name:', ''));
      // Set initial focus to message input box.
      $('#message').focus();
      // Start the connection.
      $.connection.hub.start().done(function () {
        $('#sendmessage').click(function () {
          // Call the Send method on the hub.
          chat.server.sendCustomMessage({ "UserName": $('#displayname').val(), "Message": $('#message').val() });
          // Clear text box and reset focus for next comment.
          $('#message').val('').focus();
        });
      });
    });
  </script>

}

<div class="container">
  <input type="text" id="message" />
  <input type="button" id="sendmessage" value="Send" />
  <input type="hidden" id="displayname" />
  <ul id="discussion"></ul>
</div>