2013-06-27 18 views
16

Có hướng dẫn tuyệt vời về SignalR giải thích cách chuyển đối tượng .NET làm tham số cho Javascript và ngược lại. Trong trường hợp đó, nó chuyển một đối tượng ChatMessage đến và đi.Làm cách nào để truyền các đối tượng phức tạp qua SignalR?

Tuy nhiên, hướng dẫn xử lý một đối tượng thực sự đơn giản. Tôi muốn xem cách xử lý các đối tượng .NET phức tạp (có các đối tượng khác như các thuộc tính) trong Javascript.

Ví dụ, hãy xem xét các đối tượng sau đây:

class Master { 
    public List<QuarterHour> QuarterHours { get; set; } 
    public List<string> Books { get; set; } 
    public int EndDay { get; set; } 
    public int StartDay { get; set; } 
} 

class QuarterHour { 
    public MinuteInstance Minute {get; set;} 
    public int HourStart { get; set;} 
} 

class MinuteInstance { 
    public bool Registered {get; set;} 
    public int NumAttendees {get; set;} 
} 

Trong .NET, tôi có thể tham khảo một giá trị như thế này: master.QuarterHours[2].Minute.Registered. Câu hỏi của tôi:

  1. Tôi làm cách nào để tham khảo master.QuarterHours[2].Minute.Registered trong phương thức người nhận ở cuối Javascript?
  2. Tôi làm cách nào để xây dựng đối tượng Master trong Javascript để được gửi đến cuối .NET?
+0

Nó sẽ được tuần tự hóa và chuyển đổi thành đối tượng JSON, giống như bạn làm việc với 'JsonResult' từ một hành động. –

+1

cũng đừng quên đặt các lớp học của bạn ** công khai ** !! –

Trả lời

17
  1. Bạn chỉ cần gửi và tham chiếu theo cùng một cách.
  2. Bạn muốn vượt qua (đây là cách có vẻ khi bạn nhận được nó từ máy chủ):
{ 
    QuarterHours: [{ 
     Minute: { 
      Registered: true, 
      NumAttendees: 1337 
     }, 
     HourStart: 1 
    }], 
    Books: ["Game of Thrones", "Harry Potter"], 
    EndDay: 2, 
    StartDay: 3 
} 
10

Bạn muốn serialize lớp học của bạn thành một đối tượng JSON. Có nhiều cách để thực hiện việc này, nhưng bạn có thể thử JSON.NET để làm điều đó nhanh chóng và dễ dàng.

Nếu nó vẫn chưa bao gồm trong dự án của bạn, bạn có thể thêm này thông qua NuGet với:

Install-Package Newtonsoft.Json 

Mã sẽ giống như thế:

var json = JsonConvert.SerializeObject(master); 

Một khi điều này được chuyển cho khách hàng- của bạn bên cạnh, bạn có thể đọc từ đối tượng JSON của mình như bất kỳ đối tượng nào khác. Bạn có thể sử dụng mã javascript sau đây để chuyển đổi thông điệp chuỗi SignalR của bạn để một đối tượng JSON:

var master = JSON.stringify(eval("(" + message + ")")); 
var registered = master.QuarterHours[2].Minute.Registered; 

Bạn cũng có thể chuyển thông tin này thông qua SignalR đến máy chủ và deserialize đối tượng JSON sử dụng JsonConvert.DeserializeObject để chuyển nó sang các lớp C# của bạn. Kiểm tra tài liệu ở đây để biết thêm chi tiết: http://james.newtonking.com/projects/json/help/

+0

Tại sao điều này lại được giảm xuống nhiều như vậy> – user1477388

+0

câu hỏi đặt ra là làm thế nào để truyền các đối tượng phức tạp đến singalR, chứ không phải làm thế nào để tuần tự hóa các đối tượng. –

+11

... và một giải pháp là sắp xếp các đối tượng vào JSON. –