2017-09-30 329 views
0

我使用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>

+0

我同意adiga。不要忘记标记答案,如果它是正确的:) – toddmo

+0

@toddmo,我也认为是这样,但它不是。任何想法在哪里,我错了吗? – t4thilina

回答

1

这可能是与chathub外壳的问题。从“SignalR 2入门”documentation

在JavaScript中对服务器类及其成员的引用是驼峰式的。代码示例在JavaScript中引用C#ChatHub类作为chatHub

因此,将其更改为

var chat = $.connection.chatHub; 

此外,<script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>应补充提及之前<script src="~/signalr/hubs"></script>

+0

它不适合我的情况。我试着改变它。还有什么可以成为问题? – t4thilina

+1

@ t4thilina在'〜/ Scripts/jquery.signalR.js'之前添加了'〜/ signalr/hubs'引用。应该颠倒过来。另外,'_Layout'中是否添加了'jquery'引用? – adiga

+0

@ t4thilina如果这不起作用,请检查控制台中是否存在任何错误。 – adiga

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> 
+0

谢谢你的建议。然后,我会尝试一个新项目。 – t4thilina

+0

@ t4thilina,我知道这看起来像是一个痛苦的屁股,但它通常以这种方式找到错误并构建一个无错误系统的结果通常不那么令人沮丧。 – toddmo