Hi,
I am using the Kendo Grid with the datasource but for some reason the grid doesn't render properly during Visual Studio's Debugging option.
However, when I go and publish it to an IIS server, it will load up everything just fine.
I noticed that during the localhost instance, I am getting an "Uncaught ReferenceError: Kendo is not defined.
Is there somethign I am missing that is causing this as published, the grid works fine, but using the localhost instance through Visual Studio, the grid is showing up with errors?
I've got a Grid with a cell that has an editor template that contains an auto complete object.
When the edit for this cell is complete, the grid displays the data as "[object Object]".
If the user goes back and uses the auto complete to select a field, the correct string is passed back to the Grid from the Editor template, however the auto complete functionality becomes buggy. (no javascript errors are thrown)
Grid Code:
@(Html.Kendo().Grid<PendingBatchListingInput>
()
.Name(
"PendingBatchListingInputGrid"
)
.Columns(c=>
{
c.Bound(a => a.InputDebtorName).Title(
"Debtor"
).EditorTemplateName(
"InputDebtorName"
)
//Shows valued of [object Object] the first time it is edited, shows correct value if user goes back to edit cell again
})
.DataSource(ds => ds.Ajax()
.Model(m =>
{
m.Id(p =>p.InputId);
})
.Create(create => create.Action(
"PendingBatchListingInputCreate"
,
"PendingBatchListing"
))
.Update(update => update.Action(
"PendingBatchListingInputUpdate"
,
"PendingBatchListing"
))
.Read(r => r.Action(
"PendingBatchListingInputRead"
,
"PendingBatchListing"
)
.Data(
"getData"
)
.Type(HttpVerbs.Post))
.ServerOperation(
false
)
)
.Editable(e=>e.Mode(GridEditMode.InCell))
)
Editor Template Code:
@model
object
<script>
function onAdditionalDataDebtorSearch() {
$(
'#InputDebtorName'
).data(
"kendoAutoComplete"
).list.width(500);
return
{
debtorName: $(
"#InputDebtorName"
).val(),
clientId:
null
};
}
</script>
@(Html.Kendo().AutoCompleteFor(m=>m)
.HighlightFirst(
true
)
.Filter(FilterType.StartsWith)
.Height(500)
.Placeholder(
"Select Debtor"
)
.DataTextField(
"Name"
)
.DataSource(source =>
{
source.Read(read =>
{
read.Action(
"ReadDebtorSearch"
,
"PendingBatchListing"
)
.Data(
"onAdditionalDataDebtorSearch"
);
})
.ServerFiltering(
true
);
})
.MinLength(5)
.Template(
"<span>"
+
"#=data.Name# | #=data.City#, #=data.State#"
+
"</span>"
)
)
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>