Hi
We are using the grid getOptions/setOptions to persist the users filters, column settings etc to a cookie
An issue we now have is it seems to persist everything including the datasource urls for read/update. This is an issue for us as we use custom MVC routes which look something like this: /jobs/1234/deliverable so the id is embedded into the url. When this is persisted the grid ends up querying data for a previously used Id.
What is the best way to prevent persisting the datasource url information and always use the URL as defined in the html page?
We have managed to get it working by doing this:
function loadGridState(grid, sessionKey) { var options = localStorage[sessionKey]; if (options) { var parsedOptions = JSON.parse(options); parsedOptions.dataSource.transport.read = grid.dataSource.transport.options.read; //dont persist datasource urls grid.setOptions(parsedOptions); }}
Is there a better way to do this and is there anything else we should be preventing (e.g. update, delete) if this were to be a generic function for the entire project?
One other strange we noticed is the object stored from getOptions is a slightly different structure to that directly on the grid.
E.g. the Grid has dataSource.transport.options.read but the getOptions stores dataSource.transport.read
Thanks
Andy

Hi,
I have a few columns defined that I don't want the user to change.
When they click a button, it calls a service which returns data. I want to update the columns with this data.
The problem is, if they're set to read-only, I can't change them, and the databound event never fires
.Events(e => e.DataBound("dataBound"))
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.Events(events => events.Error("error_handler"))
.Model(model =>
{
model.Id(p => p.SnapshotDefinitionID);
//model.Field(p => p.NextSnapshotQueueID).Editable(false);
//model.Field(p => p.NextSnapshotQueueTime).Editable(false);
model.Field(p => p.LastSnapshotQueueID).Editable(false);
model.Field(p => p.LastSnapshotQueueTime).Editable(false);
model.Field(p => p.NextScheduleID).Editable(false);
model.Field(p => p.NextScheduleTime).Editable(false);
model.Field(p => p.LastScheduleID).Editable(false);
model.Field(p => p.LastScheduleTime).Editable(false);
model.Field(p => p.SnapshotQueueCount).Editable(false);
model.Field(p => p.ScheduleCount).Editable(false);
//model.Field(p => p.Client).DefaultValue(
// ViewData["defaultClient"] as DropDownListViewModel);
})
.Create(update => update.Action("BulkCreate", "SnapshotDefinition"))
.Read(read => read.Action("BulkRead", "SnapshotDefinition", new { clientId = @Request["ClientID"], snapshotDefinitionID = @Request["SnapshotDefinitionID"] }))
.Update(update => update.Action("BulkUpdate", "SnapshotDefinition"))
.Destroy(update => update.Action("BulkDestroy", "SnapshotDefinition"))
function createSnapshot(e) {
window.grid = $("#grid").data("kendoGrid");
window.dataItem = window.grid.dataItem($(event.srcElement).closest("tr"));
//alert(grid);
if (dataItem.NextSnapshotQueueID && dataItem.NextSnapshotQueueID != 0 && dataItem.CurrentPercentageComplete == 0) {
$.ajax({
url: "/SnapshotQueue/CancelSnapshotQueue",
//send current record ID to the server
data: { SnapshotQueueID: dataItem.NextSnapshotQueueID },
success: function (data) {
//update the current dataItem with the received data from the server
window.dataItem.set('NextSnapshotQueueID', '0');
window.dataItem.set('NextSnapshotQueueTime', '');
}
});
} else {
if (dataItem.CurrentPercentageComplete == 0) {
$.ajax({
url: "/SnapshotDefinition/CreateSnapshot",
//send current record ID to the server
data: { SnapshotDefinitionID: window.dataItem.SnapshotDefinitionID },
success: function (data) {
//update the current dataItem with the received data from the server
if (data['NextSnapshotQueueID']) {
window.dataItem.set('NextSnapshotQueueID', data['NextSnapshotQueueID']);
window.dataItem.set('NextSnapshotQueueTime', kendo.parseDate(data['NextSnapshotQueueTime']));
}
//for (var property in data) {
// dataItem.set(property, data[property]);
//}
}
});
}
}
}
function dataBound(e) {
var rows = this.table.find("tr[role='row']");
for (var i = 0; i < rows.length; i++) {
var model = this.dataItem(rows[i]);
if (model.NextSnapshotQueueID != 0 && model.CurrentPercentageComplete == 0) {
$(rows[i]).find(".k-grid-CreateSnapshot").contents().last()[0].textContent = 'Cancel Queued Snapshot';
}
if (model.NextSnapshotQueueID != 0 && model.CurrentPercentageComplete != 0) {
$(rows[i]).find(".k-grid-CreateSnapshot").contents().last()[0].textContent = '';
$(rows[i]).find(".k-grid-CreateSnapshot").width(100);
$(rows[i]).find(".k-grid-CreateSnapshot").removeClass('k-button');
$(rows[i]).find(".k-grid-CreateSnapshot").kendoProgressBar({
value: model.CurrentPercentageComplete,
max: 100
});
}
}
}
When a user selects a row in my grid, I can get the dataItem from a button click as follows:
$("#viewApplicationBtn").on("click", function () {
var grid = $("#Grid").data("kendoGrid");
var gridData = grid.dataItem(grid.select());
What I would like to do from this point is post this back to my controller, let the MVC model binder map to my ViewModel, and then redirect to another view which is of that model type.
The roadblock I'm facing is that an ajax post won't accomplish this and I can't pass the properties in a Url.Action helper because there are too many
here is my ajax:
$.ajax({
type: "POST",
url: "@Url.Action("ValidateModel")",
datatype: "json",
contentType: "application/json",
data: JSON.stringify(gridData),
success: function(data) {
window.location.href = @Url.Action("Details", "GridController");
},
error: function(data) {
console.log("post failed");
}
});
So how can I use my grid selection to post to another view with a Model?
<div id="myDiv"></div>@(Html.Kendo().Window() .Draggable(true) .Resizable() .Width(300) .Name("myWindow") .AppendTo("myDiv") .Content("some content here") .Visible(false))<button id="myBtn" onclick="showWindow();">Show</button><style> #myDiv { position: absolute; top: 200px; right: 200px; }</style><script> function showWindow() { var window = $("#myWindow").data("kendoWindow"); window.open(); }</script>
How do I prevent the command buttons from wrapping in the command column on each of the grid rows? I want them to render in a straight, horizontal line even if they extend past the edge of the grid.
like this:
+ ---------------------------------------------------------+| column 1 | ... | column n | [btn1] [btn2] [btn3] [btn4] |+ ---------------------------------------------------------+instead of:
+ -------------------------------------------+| column 1 | ... | column n | [btn1] [btn2] || | | | [btn3] [btn4] |+ -------------------------------------------+I have used Kendo UI (version: "2014.1.416) as before, after I upgrade to "2015.1.408".
My browser console occur the following error: Uncaught TypeError: s.attr(...).kendoColumnSorter is not a function
Could anyone give me some suggestion ? Thanks you very much
