How to pass complex objects via SignalR?

2019-03-23 15:19发布

There is an excellent tutorial on SignalR that explains how to pass .NET objects as parameters to Javascript and vice versa. In that case it passes a ChatMessage object to and from.

However, the tutorial addresses a really simple object. I'd like to see how to deal with complex .NET objects (that have other objects as properties) in Javascript.

For instance, consider the following object:

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;}
}

In .NET, I can reference a value like this: master.QuarterHours[2].Minute.Registered. My questions:

  1. How would I do reference master.QuarterHours[2].Minute.Registered in the receiver method on the Javascript end?
  2. How would I build the Master object in Javascript to be sent to the .NET end?

2条回答
Lonely孤独者°
2楼-- · 2019-03-23 15:40
  1. You just send it and reference it the same way.
  2. You'd pass (this is how it looks when you get it from the server):
{
    QuarterHours: [{
        Minute: {
            Registered: true,
            NumAttendees: 1337
        },
        HourStart: 1
    }],
    Books: ["Game of Thrones", "Harry Potter"],
    EndDay: 2,
    StartDay: 3
}
查看更多
姐就是有狂的资本
3楼-- · 2019-03-23 15:59

You would want to serialize your class into a JSON object. There are many ways to accomplish this, but you can try JSON.NET to do it quick and easy.

If its not already included in your project, you can add this through Nuget with:

Install-Package Newtonsoft.Json 

The code would look something like:

var json = JsonConvert.SerializeObject(master);

Once this is passed to your client-side, you can then read from your JSON object like any other. You can use the following javascript code to convert your SignalR string message to a JSON object:

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

You can also pass this through SignalR to the server and deserialize the JSON object using JsonConvert.DeserializeObject in order to convert it to your C# classes. Check out the documentation here for further details: http://james.newtonking.com/projects/json/help/

查看更多
登录 后发表回答