'How to Pass Parameters to SignalR Read Opeartion of KendoUI DataSource

I am using a Kendo UI dataSource to bind KendoUIScheduler through SignalR. How can I pass parameters to the read operation of the dataSource with SignalR bindings?

I am using the following code:

var hub = $.connection.schedulerHub;
var hubStart = $.connection.hub.start();

$('#scheduler').kendoScheduler({
    mobile: true,
    height: 600,
    views: [
        'day',
        'week',
        'month',
        'agenda',
        { type: 'timeline', selected: true }
    ],
    timezone: 'Etc/UTC',

    dataSource: {
        type: "signalr",
        push: function (e) {
           alert(e.type);
        },
        autoSync: true,
        transport: {
            signalr: {
                promise: hubStart,
                hub: hub,
                server: {
                    read:"read",
                    update: "update",
                    destroy: "destroy",
                    create: "create"
                },
                client: {
                    read:"read",
                    update: "update",
                    destroy: "destroy",
                    create: "create"
                }
            }
        },

        schema: {
            model: {
                id: 'SchedulerID',
                fields: {
                    SchedulerID: { type: 'number', from: 'SchedulerID' },
                    start: { type: 'date', from: 'Start' },
                    end: { type: 'date', from: 'End' },
                    startTimezone: { from: "StartTimezone" },
                    endTimezone: { from: "EndTimezone" },
                    Title: { from: 'Title' },
                    isAllDay: { type: 'boolean', from: 'IsAllDay' },
                    recurrenceId: { from: "RecurrenceId" },
                    recurrenceException: { from: "RecurrenceException" },
                    recurrenceRule: { from: "RecurrenceRule" },
                    Users: { nullable: true, from: 'Users' },
                },
            }
        }
    },

    group: {
        resources: ['Users'],
        orientation: 'vertical'
    },
    resources: [
        {
            field: 'Users',
            name: 'Users',
            dataSource: Users,
            multiple: false,
            title: 'Users'
        }
    ]
});


Solution 1:[1]

I realize this question is old, but I was trying to find this same answer and didn't find any clear solutions. I did find some hints in other threads that led me to a solution although I'm sure there are better ones (I wasn't able to figure out how to send the parameters separately - only as one object).

In your datasource, use the parameterMap function to put in whatever custom parameters you want. When binding to WCF (commented code) you can separate the parameters for the call but I couldn't get that to work with the SignalR implementation.

type: "signalr",
            transport: {
                parameterMap: function (data, type) {

                    switch (type) {
                        case "read":
                            {
                                // this works
                                var request = {};
                                var chkunsub = $('#chkunsubscribed').is(':checked');
                                request.unsubscribed = chkunsub;
                                request.oKendo = data;
                                return request;
                                // Does not work (separating parameters)
                                //return {
                                //    unsubscribed: chkunsub,
                                //    oKendo: data
                                //};
                            }
                            // Does not work either (separating parameters)
                            //return kendo.stringify({
                            //    unsubscribed: chkunsub ? 1 : 0,
                            //    oKendo: data
                            //});
                    }
                },

Note that the "data" variable contains the filter, paging, grouping, etc. (I'm binding to a grid but I would think it's the same for scheduler).

Then on the server side in your hub, you just need to mirror the class structure like this (my CKendoGridOptions class has all of the properties from the API such as page, skip, filter, etc).

Public Class EventRequestData
    Public Property unsubscribed As Boolean
    Public Property oKendo As CKendoGridOptions
End Class

' This works
Public Function read(data As EventRequestData) As OrmedReturnData
    Dim oReturn As New OrmedReturnData

    If IsLoggingEnabled() Then
        WriteToEventLog("Hub getevent_item called")
    End If

    Dim oToken As TokenHelper.TokenData = TokenHelper.ValidateToken(New Guid(Context.Request.Cookies("token").Value))
    If oToken.TokenOK = False Then
        oReturn.Success = False
        oReturn.ErrorMessage = ERROR_INVALID_TOKEN
    Else
        Dim oData As New EventItems
        oReturn = oData.Getevent_items(data.unsubscribed, data.oKendo)
    End If

    Return oReturn

End Function

I hope this helps someone else who is trying to pass parameters to a read function using Kendo in jQuery and SignalR.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Nathan