将对象从Ajax传递到C#WebApi

时间:2017-03-25 15:02:56

标签: javascript c# jquery ajax asp.net-web-api

我仍然不能熟练地调用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 还有更多,我无法在这里添加。

我认为在传递数据的两种情况下我的主要问题。 我在这里缺少什么?

2 个答案:

答案 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对象。