Передача событий полного календаря в метод контроллера

#c# #model-view-controller #fullcalendar

#c# #модель-представление-контроллер #полный календарь

Вопрос:

Я пытаюсь опубликовать fullCalendar события в своем методе действия контроллера, но по какой-то причине json, который я передаю из представления в контроллер, отображается как null. Я перепробовал все возможные комбинации, например, изменение аргумента action на мой тип модели, на строковый тип, даже передавая простой jason, все они отображаются как null в моем аргументе action. Вот мой код Ajax и метод контроллера, я уверен, что это небольшая проблема, но я не могу понять, что я делаю не так.

             $("#calendar").fullCalendar({

                header: {
                    left: 'prevYear,prev,next,nextYear',
                    center: 'title',
                    right: 'month,agendaWeek,agendaDay',
                },

                defaultView: 'month',
                editable: true,
                alldayslot: false,
                selectable: true,
                slotminutes: 15,
                nextDayThreshold: "00:00:00",
                events: "/Home/FullCalendar",
                eventDrop: function(event, delta, revertFunc)
                {

                    if (confirm("Even changed")) {
                        Update(event);

                    }

                    else revertFunc();

                },


            });


        function Update(event) {
            var datarow = new Object();
                 datarow.TaskId = event.id;
                datarow.StartDate = event.start;
                datarow.EndDate = event.end;

           debugger;
           $.ajax({

               type: "post",
               dataType: "json",
               contentType: "application/json; charset=utf-8",
               data: JSON.stringify(datarow),
                url: "/Home/UpdateTask",
                success: function (data) {
                    debugger;

                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert(xhr.status);
                    debugger;
                }

            });

        }


  });
 

Мой метод контроллера

 [HttpPost]
    public void UpdateTask(Tasks td)

    {

        //  Update event in database 




    }
 

Комментарии:

1. Хороший вопрос, но сильно зависит от того, как работает ваш MVC. Если вы используете Request.Form["TaskId"] on public void UpdateTask(Tasks td) , это null?

Ответ №1:

Вот как у меня это работало изначально (сейчас сильно изменено, отличный плагин — FullCalendar).

 $(document).ready(function () {

var calendar = $('#calendar').fullCalendar({
    events: '/BookingTwo/GetDiaryEvents/',
    header: {
        left: 'prev,next today',
        center: 'title',
        right: 'month,agendaWeek,agendaDay'
    },
    defaultView: 'month',
    editable: false,
    contentHeight: 700,
    selectable: false,        

    eventClick: function (event, jsEvent, view) {
        var mywhen = moment(event.start).format('MMM Do h:mm A')   ' - '   moment(event.end).format('MMM Do h:mm A');
        $("#startTime").html(moment(event.start).format('MMM Do h:mm A'));
        $("#endTime").html(moment(event.end).format('MMM Do h:mm A'));
        $('#modalTitle').html(event.title);
        $('#modalBody').html(event.description);
        $('#etad').html(event.etad);
        $('#etadsub').html(event.etadsub);
        $('#when').text(mywhen);           
        $('#fullCalModal').modal();
    },


    dayClick: function (date, allDay, jsEvent, view) {
        var mywhen = moment(event.start).format('MMM Do h:mm A')   ' - '   moment(event.end).format('MMM Do h:mm A');
        $("#customId").html(moment(event.start).format('MMM Do h:mm A'));
        $("#LeaveStart").html(moment(event.start).format('MMM Do h:mm A'));
        $("#LeaveFinish").html(moment(event.end).format('MMM Do h:mm A'));
        $('#title').html(event.title);
        $('#StaffID').html(event.userId);
        $('#selectrole').html(event.RowId);
        $('#customdescription').html(event.description);
        $('#sicktype').html(event.ETADType);
        $('#sicksub').html(event.ETADSubType);
        $('#eventstatus').html(event.EventStatus);
        $('#when').text(mywhen);
        $('#popupEventForm').modal();
    }

});

$('#btnPopupCancel').click(function () {
    ClearPopupFormValues();
    $('#popupEventForm').hide();
});

$('#btnPopupSave').click(function () {

    $('#popupEventForm').hide();

    var dataRow = {
        'Id': $('#customId').val(),
        'Subject': $('#title').val(),
        'Description': $('#customdescription').val(),
        'StartTime': $('#LeaveStart').val(),
        'EndTime': $('#LeaveFinish').val(),           
        'SelectRole': $('#SelectRole').val(),
        //'Recurrence': $('#eventDuration').val(),
        //'AllDay': $('#eventDuration').val(),
        //'AllRoles': $('#eventDuration').val(),
        'ETADType': $('#SicknessType').val(),
        'ETADSubType': $('#SicknessSubType').val(),
        //'RecurrenceRule': $('#eventDuration').val(),
        //'EventDate': $('#eventDuration').val(),
        'StaffID': $('#StaffID').val(),
        //'EventStatus': $('#EventStatus').val()
        //'Duration': $('#eventDuration').val(),
        //'colourId': $('#eventDuration').val()


    }

    ClearPopupFormValues();

    $.ajax({
        type: 'POST',
        url: "/BookingTwo/SaveEvent",
        data: dataRow,
        success: function (response) {
            if (response == 'True') {
                $('#calendar').fullCalendar('refetchEvents');
                alert('New event saved!');
            }
            else {
                alert('Error, could not save event!');
            }
        }
    });
});

function ShowEventPopup(date) {
    ClearPopupFormValues();
    $('#popupEventForm').show();
    $('#title').focus();
}

function ClearPopupFormValues() {
    $('#customId').val("");
    $('#title').val("");
    $('#LeaveStart').val("");
    $('#LeaveFinish').val("");
}


function UpdateEvent(EventID, EventStart, EventEnd) {

    var dataRow = {
        'id': EventID,
        'NewEventStart': EventStart,
        'NewEventEnd': EventEnd
    }

    $.ajax({
        type: 'POST',
        url: "/BookingTwo/UpdateEvent",
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify(dataRow)
    });
}
 

});

И вот текущее действие контроллера

   [HttpPost]
    public ActionResult SaveEvent(DiaryEvent events)
    {
        try
        {
            int submit = bookingService.Insert(events);
            //get record here to check if inserted
            if(submit > 0)
            {
            }
        }
        catch(Exception ex)
        {
            ErrorLog.Capture(ex);
            return new HttpStatusCodeResult(HttpStatusCode.InternalServerError);
            //return some shit
        }
        return new HttpStatusCodeResult(HttpStatusCode.Created);
    }