2014-04-01 78 views
0

我的控制器類中有兩個變量,第一個變量名爲currentUserId,它意味着存儲當前登錄到網站的用戶。第二個變量是currentRoomId,用於跟蹤用戶所在的當前聊天室。問題是,當用戶登錄時,它將正確的變量存儲到兩個變量中,但是在離開它的作用域後不保存值。我需要做的基本事情是跟蹤兩個變量。我不確定要做到這一點的最佳方式。跟蹤C#控制器和視圖中的兩個變量

這是我目前有:

我的控制器:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Configuration; 
using System.Web.Mvc; 
using System.Web.Script.Serialization; 
using Microsoft.Ajax.Utilities; 
using SignalRChat.Models; 
using System.Web; 

namespace SignalRChat.Controllers 
{ 
    public class HomeController : Controller 
    { 

     ChatDBEntities DB = new ChatDBEntities(); 
     ChatDBEntities1 DB_Uno = new ChatDBEntities1(); 
     ChatDBEntities2 DB_Dos = new ChatDBEntities2(); 
     int currentUserId = -1; 
     int currentRoomId = 1; 

     public ActionResult Chat() 
     { 

      return View(); 
     } 

     public ActionResult Users() 
     { 
      return View(); 
     } 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult About() 
     { 
      ViewBag.Message = "Your application description page."; 

      return View(); 
     } 

     public ActionResult Contact() 
     { 
      ViewBag.Message = "Your contact page."; 

      return View(); 
     } 

     [HttpPost] 
     public bool AddMessage(string messageCont) 
     { 
      var authorId = (int) Session["currentUserId"]; 
      var message = new ChatMessage(); 
      message.Author = DB_Dos.ChatRoomUsers.Find(authorId).UserName; // Add Code to get the actual user 
      message.AuthorId = authorId; ; //Add Code to get current user Id 
      message.Message = messageCont; 
      message.MessageDate = DateTime.UtcNow; 
      message.RoomId = (int)Session["currentRoomId"]; ; //Add Room Code 
      message.RoomName = DB_Uno.ChatRooms.Find(currentRoomId).RoomName; // Get actual name based on id 

      try 
      { 
       DB.ChatMessages.Add(message); 
       DB.SaveChanges(); 
       return true; 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     } 

     [HttpGet] 
     public string GetMessages(int roomId) 
     { 
      Session["currentRoomId"] = roomId; 
      var messages = (from message in DB.ChatMessages where message.RoomId == roomId orderby message.MessageDate ascending select message).ToList(); 
      var serializer = new JavaScriptSerializer(); 
      string json = serializer.Serialize(messages); 
      return json; 
     } 

     [HttpGet] 
     public int GetCurrentRoomId() 
     { 
      return currentRoomId; 
     } 

     [HttpGet] 
     public int GetCurrentUserId() 
     { 
      return currentUserId; 
     } 

     [HttpPost] 
     public bool AddRoom(string chatRoom) 
     { 
      var room = new ChatRoom(); 

      room.IsActiveRoom = true; 
      room.RoomName = chatRoom; 
      room.isDefaultRoom = false; 
      room.UserCount = 1; 
      room.Id = -1; 
      try 
      { 
       DB_Uno.ChatRooms.Add(room);  
       DB_Uno.SaveChanges(); 
       return true; 
      } 
      catch (Exception) 
      { 
       return false; 
      } 
     } 

     [HttpGet] 
     public string GetRooms() 
     { 
      var rooms = DB_Uno.ChatRooms; 
      var serializer = new JavaScriptSerializer(); 
      string json = serializer.Serialize(rooms); 
      return json; 
     } 

     public ActionResult AddUser() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult AddUser(ChatRoomUser user) 
     { 
      var users = DB_Dos.ChatRoomUsers; 

      try 
      { 
       user.LastActivity = DateTime.UtcNow; 
       user.RoomId = 1; 
       user.RoomName = "General Chat"; 
       users.Add(user); 
       DB_Dos.SaveChanges(); 
       currentUserId = user.UserId; 
       return View("Chat"); 
      } 
      catch(Exception) 
      { 
       return View(); 
      } 
     } 

     public ActionResult Login() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Login(ChatRoomUser LUser) 
     { 
      var userId = (from u in DB_Dos.ChatRoomUsers where u.UserName == LUser.UserName select u.UserId).ToList(); 
      var user = DB_Dos.ChatRoomUsers.Find(userId[0]); 
      if(user.password == LUser.password) 
      { 
       currentUserId = user.UserId; 
       user.LastActivity = DateTime.UtcNow; 
       Session["currentRoomId"] = user.RoomId; 
       Session["currendUserId"] = user.UserId; 
       DB_Dos.SaveChanges(); 
       return View("Chat"); 
      } 
      else 
      { 
       return View(); 
      } 
     } 
    } 
} 

這是我的看法:

@{ 
    ViewBag.Title = "Chat"; 
} 
<h2>General Chat</h2> 

<div id="wrapper"> 

    <div id="upper-wrapper"> 
     <div id="available-rooms-dialog"> 
      <h4>Available Rooms</h4> 
     </div> 
     <form id="ava-rooms"> 
      <input type="button" onclick="GetRoomName()" id=" createroom" value="Create Room" /> 
     </form> 
     <div id="discussion-dialog"> 
      <textarea rows="30" cols="50" id="discussion"></textarea> 
     </div> 
    </div> 
    <div id="message-dialog"> 
     <textarea rows="3" id="message">Type your message</textarea> 
     <br/> 
     <input type="button" id="sendmessage" value="Post" /> 
     <input type="hidden" id="displayname" /> 
     <input type="checkbox" id="enter-sends-message"/> 
     Enter sends message 
    </div> 
</div> 
@section scripts 
    { 
    <script src="~/Scripts/jquery.signalR-2.0.2.min.js"></script> 
    <script src="~/signalr/hubs"></script> 
    <script type="text/javascript"> 
    var json; 
    var currentUserId; 
    var CurrentRoomId; 
    var MyVariable = '@ViewBag.MyVariable'; 


    $(function() { 
     LoadRooms(); 
     // Reference the auto-generated proxy for the hub. 
     var chat = $.connection.chatHub; 
     // Create a function that the hub can call back to display messages. 
     chat.client.addNewMessageToPage = function (name, message) { 
      // Add the message to the page. 
      $.ajax(
      { 
       type: "Get", 
       url: "@Url.Action("GetCurrentRoomId", "Home")", 
       success: function (data) 
       { 
        currentRoomId = data; 
       } 
      }); 

      $.ajax(
      { 
       type: "Get", 
       url: "@Url.Action("GetCurrentUserId", "Home")", 
       success: function (data) 
       { 
        currentUserId = data; 
       } 
      }); 

      //TODO: Add Record to Server 
      $.ajax(
      { 
       type: "Post", 
       url: "@Url.Action("AddMessage", "Home")", 
       data: { messageCont: message.toString()}, 
       success: function (data) { 
        for (var i = 0; i < data.length; i++) { 
         //access with data[i].modelattribute 
        } 
       } 
      }); 

      $.ajax(
      { 
       type: "Get", 
       url: "@Url.Action("GetMessages", "Home")", 
       success: function (data) { 
        json = data; 
        var obj = JSON.parse(json); 
        for (var i = 0; i < data.length; i++) { 
         //access with data[i].modelattribute 
         $('#discussion').append(htmlEncode(obj[i].Author) + " : " + htmlEncode(obj[i].Message) + "\r\n"); 
        } 
       } 
      }); 

     }; 

     // Get the user name and store it to prepend to messages. 
     // 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.send($('#displayname').val(), $('#message').val()); 
       // Clear text box and reset focus for next comment. 
       $('#message').val('').focus(); 
      }); 
     }); 
    }); 

    // This optional function html-encodes messages for display in the page. 
    function htmlEncode(value) { 
     var encodedValue = $('<div />').text(value).html(); 
     return encodedValue; 

    } 
    function GetRoomName() { 
     var newRoomName = prompt('Enter a new Room Name', 'Name'); 
     $.ajax(
     { 
      type: "Post", 
      url: "@Url.Action("AddRoom", "Home")", 
      data: { chatRoom: newRoomName }, 
      success: function (data) { 
       for (var i = 0; i < data.length; i++) { 
        //access with data[i].modelattribute 
       } 
      } 
     }); 
    } 

     function LoadRooms() { 

      $.ajax(
      { 
       type: "Get", 
       url: "@Url.Action("GetRooms", "Home")", 
       success: function (data) { 
        json = data; 
        var obj = JSON.parse(json); 
        for (var i = 0; i < data.length; i++) { 
         //access with data[i].modelattribute 
         // Add an Onlick event to this statment that calls LoadRoomMessages 
         //onclick="GetRoomName()" 
         $('#ava-rooms').append("<input type=\"button\" " +"onclick=LoadRoomMessages(" + obj[i].Id + ") " + "id=\"" + obj[i].RoomName +"\"" + "value=\"" + obj[i].RoomName +"\" />"); 
        } 
       } 
     }); 

     } 

     function LoadRoomMessages(id) 
     { 
      $.ajax(
      { 
       type: "Get", 
       url: "@Url.Action("GetMessages", "Home")", 
       data: { roomId: id }, 
       success: function (data) 
       { 
         $('#discussion').empty(); 
         json = data; 
         var obj = JSON.parse(json); 
         for (var i = 0; i < data.length; i++) 
         { 
          $('#discussion').append(htmlEncode(obj[i].Author) + " : " + htmlEncode(obj[i].Message) + "\r\n"); 
         } 
       } 
      }); 
     } 

</script> 
} 
} 

有什麼建議嗎?

回答

4

您可以使用Session來存儲這些變量。只要會話沒有過期,它們將在任何控制器或視圖上可用。

要對控制器設置會話變量

Session["currentRoomId"] = roomId; 

要獲得控制器會話變量

int roomId = (int)Session["currentRoomId"]; 

要獲得一個Razor視圖

@Session["currentRoomId"] 
+0

會話變量這聽起來正是我需要的。我將如何實現這一點? – user977154

+0

好的,太好了。謝謝!我將從那開始 – user977154

+0

你碰巧知道Session的參考嗎?因爲當我使用上述參考時,它沒有會話關鍵字。 – user977154

相關問題