我仍然不能熟练地调用WebAPI服务。我成功完成了简单的项目,但现在我的需求变得越来越复杂,事情总是失败。
我将MVC 5用于WebAPI,并使用常规jQuery函数调用。
我的模特
在这里,我管理诊所的患者预约。我对患者和约会实体使用以下模型:
public class Patient
{
// Personal data
public int Id { get; set; }
public string Name { get; set; }
}
public class Appointment
{
public int Id { get; set; }
public DateTime Date { get; set; } // date only
public int Order { get; set; }
public string PatientName { get; set; }
// Parent data
public Patient Patient { get; set; }
public int PatientId { get; set; }
public Organization Organization { get; set; }
public int OrganizationId { get; set; }
}
我的DTO
public class AppointmentDto
{
public int Id { get; set; }
public int Order { get; set; }
public string PatientName { get; set; }
public PatientDto Patient { get; set; }
}
public class PatientDto
{
public string Name { get; set; }
}
第一案例
我想在一天内为约会设置新的订单。我发送JSON对象列表,其中包含要更改的约会ID和各自的订单。
服务行动:
[HttpPost]
public IHttpActionResult UpdateOrder(List<AppointmentDto> dto)
{
_unitOfWork.Appointments.UpdateOrder(dto);
_unitOfWork.Complete();
return Ok();
}
服务电话:
// Handler methods
var rearrangeAppointments = function (event, ui) {
// Json object to pass
var orderedAppointments = [];
// Looping through appointments
var i = 0;
$("#sortable").children().each(function () {
// Set new order
i++;
orderedAppointments.push({ "Id": this.getAttribute("data-id").toString(), "Order": i.toString() });
});
// Call service
appointmentsService.updateOrder(orderedAppointments, done, fail);
};
var updateOrder = function (orderedAppointmens, done, fail) {
$.ajax({
url: "/api/appointments",
method: "POST",
data: orderedAppointmens,
dataType: "Json"
})
.done(done)
.fail(fail);
};
成功调用服务,但传递的列表始终为空。我调试了JavaScript代码,并成功构建了JSON对象数组。还调试了MVC代码并测试了Postman服务,它工作得很好。此下拉将对象列表从客户端传递到服务器。
第二案例
这次是接听电话。如果约会是一个特定的日期来更新视图,我想得到列表。
服务行动:
public IEnumerable<AppointmentDto> GetAppointments(DateTime date)
{
var organizationId = _unitOfWork.ApplicationUsers.GetOrganizationId(User.Identity.GetUserId());
var appointments = _unitOfWork.Appointments.GetAppointments(date, organizationId);
return appointments.Select(Mapper.Map<Appointment, AppointmentDto>);
}
服务电话:
$("#datepicker").datepicker({
// TODO: Refactor to pettern
onSelect: function (dateText, inst) {
var selectedDate = $(this).datepicker('getDate');
var date = JSON.stringify(selectedDate);
$.ajax({
contentType: 'application/json; charset=utf-8',
dataType: "json",
url: "/api/appointments",
data: date,
success: function (appointments) {
alert("Service call succeeded!")
alert(appointments.length);
}
})
.fail(function () {
alert("Failure!");
});
}
});
当我在不传递日期的情况下测试代码(将日期硬编码到操作方法中)时,它的效果非常好。当我在参数中添加日期时(在action方法和AJAX调用中),它根本不起作用。
我在这里和其他来源尝试了许多链接和文章但没有成功,如下所示: Pass a datetime from javascript to c# (Controller) Pass Date Values from Ajax Call to MVC 还有更多,我无法在这里添加。
我认为在传递数据的两种情况下我的主要问题。 我在这里缺少什么?
答案 0 :(得分:1)
第二种情况:你发送日期时间吗?如果您这样做,URL可能包含&#34;:&#34; (12:00)&amp; HTTP请求拒绝此类型的字符
答案 1 :(得分:0)
与一位朋友进行一些追踪,并审阅其他一些文章和问题......
第一个案例(传递对象列表)
我使用JSON.stringify(orderedAppointmens)
重新格式化了对象数组,并将contentType: 'application/json; charset=utf-8'
添加到服务调用中。代码应如下所示:
var updateOrder = function (orderedAppointmens, done, fail) {
orderedAppointmens = JSON.stringify(orderedAppointmens);
$.ajax({
url: "/api/appointments",
method: "POST",
data: orderedAppointmens,
contentType: 'application/json; charset=utf-8',
dataType: "Json"
})
.done(done)
.fail(fail);
};
第二种情况(传递Date对象)
我从服务调用中删除了Json dataType,并将日期连接到URL,如下所示:
$.ajax({
url: "/api/appointments?date=" + selectedDate.toISOString(),
type: "GET",
success: function (appointments) {
alert(appointments.length);
}
});
这很好用,Date对象成功传递给后端的DateTime对象。