如何使用 SignalR hub.server 切换类?

How to toggleClass with SignalR hub.server?

我目前正在学习 SignalR 使用 .Net MVC 并按照教程来开发一个简单的应用程序。现在它工作正常,但我无法理解某些部分,如果可能的话,我想对其进行一些改进。

Plane Seats Tutorial link

目前,该应用程序的工作原理是当用户点击一个座位时,它会保留它。而且没有回头路可走。我想像切换一样实现,如果用户想要更换座位,他可以取消预订他选择的座位,然后可以自由预订另一个座位。我无法用 myHub.server.selectSeat(userId, $(this).toggleClass(settings.selectingSeatCss)); 做到这一点。每当我点击一个座位时,它都会在开发工具中给我这个错误

Uncaught: Converting circular structure to JSON

var settings = {
    rows: 5,
    cols: 15,
    rowCssPrefix: 'row-',
    colCssPrefix: 'col-',
    seatWidth: 35,
    seatHeight: 35,
    seatCss: 'seat',
    selectedSeatCss: 'selectedSeat',
    selectingSeatCss: 'selectingSeat'
};
$(function() {
    //// Start the hub
    window.hubReady = $.connection.hub.start();
});
$.connection.hub.start().done(function() {
    // Call the server side function AFTER the connection has been started
    myHub.server.createUser();
    //invoke for the user data
    myHub.server.populateSeatData();
});
// Seat selection
$('.' + settings.seatCss).click(function() {
    if ($(this).hasClass(settings.selectedSeatCss)) {
        alert('Sorry, this seat has been already reserved');
    } else {
        //$(this).toggleClass(settings.selectingSeatCss);
        //myHub.server.selectSeat(userId, $(this).toggleClass(settings.selectingSeatCss));
        myHub.server.selectSeat(userId, $(this)[0].innerText);
    }
});
// Client method to broadcast the message
myHub.client.createUser = function(message) {
    userId = message;
};
//get seats data
myHub.client.populateSeatData = function(message) {
    var parsedSeatsData = JSON.parse(message);
    $('li.seat').removeClass(settings.selectedSeatCss);
    $.each(parsedSeatsData, function(index, value) {
        $("a:contains('" + value.seatnumber + "')").parent("li").toggleClass(settings.selectedSeatCss);
    });
};
// Client method to broadcast the message as user selected the seat
myHub.client.selectSeat = function(message) {
    var parsedSeatData = JSON.parse(message);
    $("a:contains('" + parsedSeatData.seatnumber + "')").parent("li").toggleClass(settings.selectedSeatCss);
};

谁能简要解释一下 str.push 在这段代码中做了什么?它究竟是什么推入阵列?

var init = function(reservedSeat) {
    var str = [],
        seatNo, className;
    for (i = 0; i < settings.rows; i++) {
        for (j = 2; j < settings.cols; j++) {
            seatNo = (i + j * settings.rows + 1);
            className = settings.seatCss + ' ' + settings.rowCssPrefix + i.toString() + ' ' + settings.colCssPrefix + j.toString();
            if ($.isArray(reservedSeat) && $.inArray(seatNo, reservedSeat) != -1) {
                className += ' ' + settings.selectedSeatCss;
            }
            str.push('<li class="' + className + '"' + 'style="top:' + (i * settings.seatHeight).toString() + 'px;left:' + (j * settings.seatWidth).toString() + 'px">' + '<a title="' + seatNo + '">' + seatNo + '</a>' + '</li>');
        }
    }
    $('#place').html(str.join(''));
};

我不得不使用 toggleSeat() 函数而不是仅仅使用 toggleClass

public void toggleSeat(int userId, int seatNumber)
        {
            PlaneSeatArrangment mySeat = allSeats.Where(s => s.SeatNumber == seatNumber).FirstOrDefault();
            var retunData = JsonConvert.SerializeObject(mySeat);
            if (mySeat != null && userId == mySeat.UserId)

            ..............               
        }