我已经显示了这个调度程序,但没有绑定到任务。视图中的调度程序。我正在使用java脚本方法来读取/创建对web api的调用
@(Html.Kendo().Scheduler<TaskViewModel> ()
.Name("AppointmentSearchScheduler")
.DataSource(dataSource => dataSource
.Custom()
.Schema(schema => schema
.Model(m => {
m.Id(f => f.TaskID);
m.Field(f => f.OwnerID).DefaultValue(1);
}))
.Transport(new {
read = new Kendo.Mvc.ClientHandlerDescriptor() {
HandlerName = "customRead"
},
create = new Kendo.Mvc.ClientHandlerDescriptor() {
HandlerName = "customCreate"
}
})))
下面是javascript处理程序方法我不包括简洁的创建处理程序。
function customRead(options){
//get the selected Row of the kendo grid
var selectedRow = $("#locationgridKendo").find("tbody tr.k-state-selected");
var scheduler = $("#AppointmentSearchScheduler").data("kendoScheduler")
//get SelectedRow data
var rowData = $('#locationgridKendo').data("kendoGrid").dataItem(selectedRow);
if (rowData !== null) {
//Convert data to JSON
var rowDataJson = rowData.toJSON();
//extract the location ID
var locationId = rowDataJson.LocationID;
var CalenderweekStartDate = new Date().toISOString();
baseUrl = $('base').attr('href');
$.ajax({
url: baseUrl + 'Schedular/api/GetAppPerLocation?locationId=' + locationId + '&date=' + CalenderweekStartDate,
type: 'GET',
cache: false,
contentType: 'application/json',
success: function (result) {
//This method is hitting and i can see the data being returned
console.log('data is received : ' + result.Data);
options.success(result.Data);
},
error: function (xhr, status, error) {
//alert("Error: Search - Index.js - submitAppointment()");
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
});
}
}
这是通过进行ajax调用调用的Web API控制器。当我使用基本的读/创语法时,控制器工作正常。 ajax调用完成,它确实回击了成功方法并返回数据但由于某种原因调度程序没有绑定到传入数据。这是我的控制器代码
[HttpGet]
[Route("api/GetAppPerLocation")]
public DataSourceResult GetAppointmentPerLocation([ModelBinder(typeof(Usps.Scheduling.Web.ModelBinders.DataSourceRequestModelBinder))] DataSourceRequest request, int locationId, DateTime date) {
List < TaskViewModel > locationAvailableAppointmentList = new List < TaskViewModel > ();
locationAvailableAppointmentList = data.Select(appt => new TaskViewModel() {
TaskID = appt.ServiceAppointmentId,
Title = "Appointment Available",
Start = DateTime.SpecifyKind(appt.AppointmentBegin, DateTimeKind.Local),
End = DateTime.SpecifyKind(appt.AppointmentEnd, DateTimeKind.Local),
Description = "",
IsAllDay = false
}).ToList();
return locationAvailableAppointmentList.ToDataSourceResult(request);
}
由于某种原因,调度程序未绑定到传入数据。当我使用基本绑定方法但不使用传输时,传入的数据工作正常。 我使用这种方法的目标是,一旦我完成了read(调度程序现在没有绑定),在创建时我需要获取我的控制器返回的新创建的任务的ID,然后将该id传递给另一个mvc控制器呈现确认页面。强烈建议采用任何其他方法来实现这一目标。
请原谅我有任何错误,因为这是我关于stackoverflow的第一个问题。
答案 0 :(得分:0)
我使用这种方法的目标是,一旦我完成了read(调度程序现在没有绑定),在创建时我需要获取由我的控制器返回的新创建的任务的ID,然后将该ID传递给另一个用于导航的mvc控制器呈现确认页面。
我推测读取没有返回正确的结果所以我必须解决这个问题。而且我的基本目标是在使用约会ID并显示确认屏幕后重定向到另一个页面。这就是完成它的方式。我知道这不是最好的方法,但已经超过一年,没有人回答问题。这是我采取的方法。
我在控制器
中向模型状态添加了一个错误if (!String.IsNullOrEmpty(task.TaskID.ToString()))//redirect to confirmation page if the appointment was added to the queue
ModelState.AddModelError("AppointmentID", confirmationNumber);
然后在客户端我在网格上配置错误事件,如此
.Events(
events => events.Error("RedirectToConfirmationPage"))
以下是 Javascript方法详情
function RedirectToConfirmationPage(e) {
console.log('RedirecToConfirmationPage method......');
console.log(e);
if (e.errors) {
var appointmentID = "";
// Create a message containing all errors.
$.each(e.errors, function (key, value) {
console.log(key);
if ('errors' in value) {
$.each(value.errors, function () {
appointmentID += this + "\n";
});
}
});
console.log('Newly Generated AppointmentID = ' + appointmentID);
// Redirect URL needs to change if we're running on AWS instead of on local developer machines
if (window.location.href.indexOf('/TestProject.Scheduling') > 1) {
window.location.href = '/Scheduler/AppointmentConfirmation?confirmationNumber=' + appointmentID
}
else {
window.location.href = '/Scheduler/AppointmentConfirmation?confirmationNumber=' + appointmentID
}
}
}
希望对未来的人有所帮助。