I'm trying to combine the SignalR live updates example with the Hierarchical grid example.
I want both grids to update via SignalR when there's a change. The Customers grid works great.
Trouble is, I can't even read the order data when I switch the Order grid to SignalR. The Read method on the child (order) grid is never called.
I wish there were more documentation on the Transport, Promise, and Hub properties.
Any suggestions?
@{
ViewBag.Title =
"Home Page"
;
}
<link href=
"@Url.Content("
~/Content/Site.css
")"
rel=
"stylesheet"
type=
"text/css"
/>
@*<link href=
"http://cdn.kendostatic.com/2016.1.112/styles/kendo.common.min.css"
rel=
"stylesheet"
type=
"text/css"
/>
<link href=
"http://cdn.kendostatic.com/2016.1.112/styles/kendo.mobile.all.min.css"
rel=
"stylesheet"
type=
"text/css"
/>
<link href=
"http://cdn.kendostatic.com/2016.1.112/styles/kendo.dataviz.min.css"
rel=
"stylesheet"
type=
"text/css"
/>
<link href=
"http://cdn.kendostatic.com/2016.1.112/styles/kendo.default.min.css"
rel=
"stylesheet"
type=
"text/css"
/>
<link href=
"http://cdn.kendostatic.com/2016.1.112/styles/kendo.dataviz.default.min.css"
rel=
"stylesheet"
type=
"text/css"
/>
<script src=
"http://cdn.kendostatic.com/2016.1.112/js/jquery.min.js"
></script>
<script src=
"http://cdn.kendostatic.com/2016.1.112/js/kendo.all.min.js"
></script>
<script src=
"//kendo.cdn.telerik.com/2016.1.112/js/kendo.all.min.js"
></script>
<script src=
"http://cdn.kendostatic.com/2016.1.112/js/kendo.aspnetmvc.min.js"
></script>*@
<script src=
"@Url.Content("
~/Scripts/kendo.modernizr.custom.js
")"
></script>
<script src=
"~/Scripts/jquery.signalR-2.2.0.min.js"
></script>
<script src=
"@Url.Content("
~/signalr/hubs
")"
></script>
<div id=
"modalWindow"
>
<h2>Delete?</h2>
<button id=
"yes"
class=
"k-button"
>Yes</button>
<button id=
"no"
class=
"k-button"
>No</button>
</div>
<script>
// var hub = $.connection.customerHub;
var
customerHub = $.connection.customerHub;
var
orderHub = $.connection.orderHub;
var
hubStart = $.connection.hub.start();
</script>
@(Html.Kendo().Notification()
.Name(
"notification"
)
.Width(
"100%"
)
.Position(position => position.Top(0).Left(0))
)
@(Html.Kendo().Grid<TelerikMvcCRUDGrid.Models.CustomerViewModel>()
.Name(
"Customers"
)
.Filterable()
.Columns(columns =>
{
columns.Bound(c => c.CustomerId).Visible(
false
);
columns.Bound(c => c.LastName)
.ClientTemplate(
"#:LastName#, #:FirstName#"
+
"#:MiddleInitial#"
)
.Title(
"Full Name"
);
columns.Bound(c => c.AccountNumber);
columns.Command(command =>
{
command.Edit();
command.Destroy();
})
.Title(
"Actions"
)
.HeaderHtmlAttributes(
new
{ style =
"font-weight:600;"
});
})
.ToolBar(toolbar => toolbar.Create().Text(
"Add new Customer"
))
.ToolBar(toolbar => toolbar.Excel().Text(
"Export to Excel"
))
.ToolBar(toolbar => toolbar.Pdf().Text(
"Export to PDF"
))
.Editable(editable => editable.Mode(GridEditMode.PopUp)
.DisplayDeleteConfirmation(
false
))
.Events(events => events.DetailExpand(
"onExpandCustomer"
))
// .Events(e => e.DataBound("onRowBound"))
.Pageable(pageable => pageable
.Refresh(
true
)
.PageSizes(
true
)
.ButtonCount(5))
.Sortable()
.Scrollable(s => s.Height(
"auto"
))
.ClientDetailTemplateId(
"Orders"
)
.DataSource(dataSource => dataSource
.SignalR()
// .AutoSync(true) // Automatically save changed data items by calling the sync method
@*.Events(events => events.Push(@<text>
function
(e) {
var
notification = $(
"#notification"
).data(
"kendoNotification"
);
notification.success(e.type);
}
</text>))*@
.PageSize(10)
// Transport is the configuration used to load and save the data items
.Transport(tr => tr
.Promise(
"hubStart"
)
// The promise returned by the start method of the SignalR connection. The promise option is mandatory.
.Hub(
"customerHub"
)
.Client(c => c
//transport.signalr.client Specifies the client-side CRUD methods of the SignalR hub.
.Read(
"read"
)
//Specifies the name of the client-side method of the SignalR hub responsible for reading data items.
.Create(
"create"
)
//Specifies the name of the client-side method of the SignalR hub responsible for creating data items.
.Update(
"update"
)
//Specifies the name of the client-side method of the SignalR hub responsible for updating data items.
.Destroy(
"destroy"
))
//Specifies the name of the client-side method of the SignalR hub responsible for destroying data items.
.Server(s => s
.Read(
"read"
)
//Specifies the name of the server-side method of the SignalR hub responsible for reading data items.
.Create(
"create"
)
// Specifies the name of the server-side method of the SignalR hub responsible for creating data items.
.Update(
"update"
)
//Specifies the name of the server-side method of the SignalR hub responsible for updating data items.
.Destroy(
"destroy"
)
//Specifies the name of the server-side method of the SignalR hub responsible for destroying data items.
)
)
.Schema(schema => schema
.Model(model =>
{
model.Id(m => m.CustomerId);
model.Field(m => m.CustomerId).Editable(
false
);
})
)
)
)
<script id=
"Orders"
type=
"text/kendo-tmpl"
>
@(Html.Kendo().Grid<TelerikMvcCRUDGrid.Models.OrderViewModel>()
.Name(
"grid_#=CustomerId#"
)
// template expression, to be evaluated in the master context
.Filterable()
.ToolBar(toolbar => toolbar.Create().Text(
"Add new Order"
))
.ToolBar(toolbar => toolbar.Excel().Text(
"Export to Excel"
))
.ToolBar(toolbar => toolbar.Pdf().Text(
"Export to PDF"
))
.Editable(editable => editable.Mode(GridEditMode.PopUp))
.HtmlAttributes(
new
{ style =
"height:100%;width:100%"
})
.Events(e => e.DataBound(
"onRowBound"
))
.Columns(columns =>
{
columns.Bound(o => o.OrderId).Visible(
false
);
columns.Bound(o => o.OrderTotal).Width(115);
columns.Bound(o => o.OrderSubtotal).Width(120);
columns.Bound(o => o.OrderTax).Width(80);
columns.Bound(o => o.DatePlaced).Width(115);
columns.Bound(o => o.DateShipped).Width(110);
columns.ForeignKey(f => f.OrderChannelId, (System.Collections.IEnumerable)
ViewData[
"orderchannels"
],
"Value"
,
"Text"
).Title(
"Channel"
);
columns.Command(command =>
{
command.Edit();
command.Custom(
"Delete"
).Click(
"openWindow"
);
}).Title(
"Order Actions"
).HeaderHtmlAttributes(
new
{ style =
"font-weight:600;"
});
})
.DataSource(dataSource => dataSource
.SignalR()
// .AutoSync(true) // Automatically save changed data items by calling the sync method
.PageSize(10)
// Transport is the configuration used to load and save the data items
.Transport(tr => tr
.Promise(
"hubStart"
)
// The promise returned by the start method of the SignalR connection. The promise option is mandatory.
.Hub(
"orderHub"
)
.Client(c => c
//transport.signalr.client Specifies the client-side CRUD methods of the SignalR hub.
.Read(
"read"
)
//Specifies the name of the client-side method of the SignalR hub responsible for reading data items.
.Create(
"create"
)
//Specifies the name of the client-side method of the SignalR hub responsible for creating data items.
.Update(
"update"
)
//Specifies the name of the client-side method of the SignalR hub responsible for updating data items.
.Destroy(
"destroy"
))
//Specifies the name of the client-side method of the SignalR hub responsible for destroying data items.
.Server(s => s
.Read(
"read"
)
//Specifies the name of the server-side method of the SignalR hub responsible for reading data items.
.Create(
"create"
)
// Specifies the name of the server-side method of the SignalR hub responsible for creating data items.
.Update(
"update"
)
//Specifies the name of the server-side method of the SignalR hub responsible for updating data items.
.Destroy(
"destroy"
)
//Specifies the name of the server-side method of the SignalR hub responsible for destroying data items.
)
)
.Schema(schema => schema
.Model(model =>
{
model.Id(o => o.OrderId);
model.Field(o => o.OrderId).Editable(
false
);
})
)
).ToClientTemplate());
</script>
<script>
var
wnd;
$(document).ready(
function
() {
wnd = $(
"#modalWindow"
).kendoWindow({
title:
"Delete confirmation"
,
modal:
true
,
visible:
false
,
resizable:
false
,
width: 300
}).data(
"kendoWindow"
);
});
function
openWindow(e) {
e.preventDefault();
var
grid =
this
;
var
row = $(e.currentTarget).closest(
"tr"
);
wnd.center().open();
$(
"#yes"
).click(
function
() {
grid.removeRow(row);
wnd.close();
});
$(
"#no"
).click(
function
() {
wnd.close();
});
}
function
onRowBound(e) {
$(
".k-grid-Delete"
).find(
"span"
).addClass(
"k-icon k-delete"
);
}
function
dataBound() {
this
.expandRow(
this
.tbody.find(
"tr.k-master-row"
).first());
}
function
onExpandCustomer() {
$(
".k-detail-cell"
).css({
"padding"
:
"10px"
,
"background-color"
:
"#f35800"
});
}
</script>
<script id=
"delete-confirmation"
type=
"text/x-kendo-template"
>
<p class=
"delete-message"
>Are you sure?</p>
<button class=
"delete-confirm k-button"
>Yes</button>
<a href=
"#"
class=
"delete-cancel"
>No</a>
</script>
<script type=
"text/javascript"
>
function
error_handler(e) {
if
(e.errors) {
var
message =
"Errors:\n"
;
$.each(e.errors,
function
(key, value) {
if
(
'errors'
in
value) {
$.each(value.errors,
function
() {
message +=
this
+
"\n"
;
});
}
});
alert(message);
}
}
</script>
<script>
function
onExpandProduct() {
$(
".k-detail-cell"
).css({
"padding"
:
"10px"
,
"background-color"
:
"white"
});
}
</script>
<script type=
"text/javascript"
>
function
error_handler(e) {
if
(e.errors) {
var
message =
"Errors:\n"
;
$.each(e.errors,
function
(key, value) {
if
(
'errors'
in
value) {
$.each(value.errors,
function
() {
message +=
this
+
"\n"
;
});
}
});
alert(message);
}
}
</script>