web-dev-qa-db-ja.com

SignalRを介して複雑なオブジェクトを渡す方法は?

SignalR には、.NETオブジェクトをパラメーターとしてJavascriptに渡す方法、およびその逆の方法を説明する優れたチュートリアルがあります。その場合、ChatMessageオブジェクトをやり取りします。

ただし、このチュートリアルでは非常に単純なオブジェクトを扱います。 JavaScriptで複雑な.NETオブジェクト(他のオブジェクトをプロパティとして持つ)を処理する方法を教えてください。

たとえば、次のオブジェクトを考えます。

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

.NETでは、次のような値を参照できます:master.QuarterHours[2].Minute.Registered。私の質問:

  1. どうすれば参照master.QuarterHours[2].Minute.Registered Javascript側のレシーバーメソッドで?
  2. .NETエンドに送信されるMasterオブジェクトをJavaScriptでどのように構築しますか?
21
AngryHacker
  1. 送信して、同じ方法で参照するだけです。
  2. あなたは合格します(これはサーバーから取得したときの外観です):
{
    QuarterHours: [{
        Minute: {
            Registered: true,
            NumAttendees: 1337
        },
        HourStart: 1
    }],
    Books: ["Game of Thrones", "Harry Potter"],
    EndDay: 2,
    StartDay: 3
}
22

クラスをJSONオブジェクトにシリアル化する必要があります。これを実現するには多くの方法がありますが、 JSON.NET を試して、すばやく簡単に試すことができます。

プロジェクトにまだ含まれていない場合は、Nugetを使用してこれを追加できます。

Install-Package Newtonsoft.Json 

コードは次のようになります。

var json = JsonConvert.SerializeObject(master);

これがクライアント側に渡されると、他のようにJSONオブジェクトから読み取ることができます。次のJavaScriptコードを使用して、SignalR文字列メッセージをJSONオブジェクトに変換できます。

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

これをSignalRを介してサーバーに渡し、JsonConvert.DeserializeObjectを使用してJSONオブジェクトを逆シリアル化してC#クラスに変換することもできます。詳細については、こちらのドキュメントをご覧ください。 http://james.newtonking.com/projects/json/help/

9
SeanPrice