Добавить события в FullCalendar из модели при загрузке страницы - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь добавить события ко всем дням календаря при загрузке страницы, и они должны иметь один из трех цветов (красный, желтый, зеленый) на основе некоторых данных, связанных с каждым днем. Простой пример с событиями на три дня:

example of fullcalendar with color coded events

I have a model that contains data on how many free pallets there are for orders on a given date. If there's less than 10 free pallets, the event should be red, if its between 10 and 149 it must be yellow and so on (as seen on the example).

This is the current "FullCalendar" script:

 var calendar = new FullCalendar.Calendar ($ ("# calendar") [0], {plugins: ['взаимодействие', 'dayGrid' ], высота: 'авто', defaultView: 'dayGridMonth', weekNumberCalculation: 'ISO', weekNumbers: true, события: [{title: '150-300', начало: '2020-07-16', цвет: 'зеленый '}, {title:' 10 -149 ', начало:' 2020-07-15 ', цвет:' желтый '}, {title:' <10 ', начало:' 2020-07-14 ', цвет:' красный '}], dateClick: function (info) {window.location.href = "Incoming? date =" + info.dateStr;}}); calendar.render (); calendar.select ('@ (Model.Date?.ToString("yyyy-MM-dd "))'); </script> 

Жестко запрограммированные события приведены только для примера.

Я хочу, чтобы при загрузке страницы заполнял календарь цветным событием на каждую дату месяца, по данным о количестве свободных поддонов. Как я могу динамически создавать эти события из данных, предоставленных моделью в моем приложении MVC (. Net)?

Я пробовал несколько предлагаемых решений с этого форума по динамическому добавлению событий, но они либо делают не работают или связаны с действиями публикации, которые я не считаю необходимыми в этом случае.

ОБНОВЛЕНИЕ

Я попытался создать действие JsonResult в своем Контроллер, который, кажется, создает допустимую строку Json, которую я могу передать в свой FullCalendar. Однако, похоже, это не работает. У меня есть это действие:

public JsonResult GetCalendarEvents(string id, DateTime? date)
        {
         //Database related code to get dates and their amount of free pallets (this is where I use the id and date parameters)
                var idEvent = 1;
                foreach (var v in days)
                {
                    var title = "";
                    var color = "";
                    var freecap = (v.DayOfWeek == DayOfWeek.Friday ? 200 : 300) - model.Incomings.Where(x => x.ExpectedDate == v &&
                            x.ExpectedPallets.HasValue).Sum(x => x.ExpectedPallets);


                    if(freecap >= 150)
                    {
                        title = "150-300";
                        color = "green";
                    } else if(freecap < 150 && freecap >= 10)
                    {
                        title = "10-149";
                        color = "yellow";
                    } else
                    {
                        title = "<10";
                        color = "red";
                    }

                    events.Add(new CalendarEvent { id = idEvent, title = title, allDay = "", start = v.Date.ToString().Substring(0,10), end = v.Date.ToString().Substring(0, 10), color = color });
                    
                    idEvent++;
                }
            }

            return Json(events, JsonRequestBehavior.AllowGet);

Результат Json выглядит так:

[{"id":1,"title":"150-300","allDay":"","start":"19-07-2019","end":"19-07-2019","color":"green"},{"id":2,"title":"150-300","allDay":"","start":"22-08-2019","end":"22-08-2019","color":"green"},{"id":3,"title":"150-300","allDay":"","start":"30-08-2019","end":"30-08-2019","color":"green"}]

Атрибуты id, allDay и end были добавлены из-за верхнего ответа в этом сообщении: Jquery Полный календарь json синтаксис источника событий но это не помогло.

Ни одно из событий не отображается в календаре, но страница и календарь загружаются нормально (без событий ). Что мне здесь не хватает?

1 Ответ

0 голосов
/ 21 июля 2020

С помощью пользователя @ADyson я нашел решение моей проблемы (проблем). Вот несколько полный пример и ответ, если кто-то еще случайно наткнется на те же проблемы или захочет работать с событиями FullCalender, подав его JSON в контексте MVC.

Сначала у меня есть событие класс с необходимыми атрибутами (на самом деле я использую только атрибуты title, start и color, но и остальные могут потребоваться, поэтому я добавил их в соответствии с этим сообщением Jquery Full Calendar json event исходный синтаксис ):

public class CalendarEvent
    {
        public int id { get; set; }
        public string title { get; set; }
        public string allDay { get; set; }
        public string start { get; set; }
        public string end { get; set; }
        public string color { get; set; }
    }

Затем в моем контроллере есть действие GetCalendarEvents, подобное этому:

public JsonResult GetCalendarEvents(string id, DateTime? date)
        {
         //Database related code to get dates and their amount of free pallets (this is where I use the id and date parameters)
                var idEvent = 1;
                foreach (var v in days)
                {
                    var title = "";
                    var color = "";
                    var freecap = (v.DayOfWeek == DayOfWeek.Friday ? 200 : 300) - model.Incomings.Where(x => x.ExpectedDate == v &&
                            x.ExpectedPallets.HasValue).Sum(x => x.ExpectedPallets);


                    if(freecap >= 150)
                    {
                        title = "150-300";
                        color = "green";
                    } else if(freecap < 150 && freecap >= 10)
                    {
                        title = "10-149";
                        color = "yellow";
                    } else
                    {
                        title = "<10";
                        color = "red";
                    }

                    events.Add(new CalendarEvent { id = idEvent, title = title, allDay = "", start = v.Date.ToString().Substring(0,10), end = v.Date.ToString().Substring(0, 10), color = color });
                    
                    idEvent++;
                }
            }

            return Json(events, JsonRequestBehavior.AllowGet);
}

logi c в действии в основном просто получает правильные данные из нашей базы данных и определение цвета и названия мероприятия (это определяется количеством свободных поддонов на нашем складе на заданную дату). Этот метод может делать все, что вам нужно, суть его в том, что он создает список событий и возвращает их как результат Json.

В моем представлении, где находятся скрипт и виджет FullCalendar Я связываю события с действием следующим образом (не забудьте изменить маршрут, контроллер, действие и строку идентификатора, чтобы они соответствовали вашим собственным):

events: '@Url.HttpRouteUrl("Default", new { controller = "Home", action = "GetCalendarEvents", id = "DOD" })'

Перед вашим заголовком может появиться строка «12a» по всем событиям. Это потому, что он указывает время начала события (которое я не установил). В любом случае вы можете добавить эти две строки в сценарий, если хотите избавиться от него:

timeFormat: 'H(:mm)', // uppercase H for 24-hour clock
displayEventTime: false

Мой полный сценарий FullCalendar выглядит так:

<script type="text/javascript">
    var calendar = new FullCalendar.Calendar($("#calendar")[0], {
        plugins: ['interaction', 'dayGrid'],
        height: 'auto',
        defaultView: 'dayGridMonth',
        weekNumberCalculation: 'ISO',
        weekNumbers: true,
        events: '@Url.HttpRouteUrl("Default", new { controller = "Home", action = "GetCalendarEvents", id = "DOD" })',
        timeFormat: 'H(:mm)', // uppercase H for 24-hour clock
        displayEventTime: false,
        dateClick: function (info) {
                window.location.href = "Incoming?date=" + info.dateStr;
            }
        });
    calendar.render();
    calendar.select('@(Model.Date?.ToString("yyyy-MM-dd"))');
</script>

Возвращенный JSON результат должен выглядеть примерно так:

[{"id":1,"title":"150-300","allDay":"","start":"2019-07-19","end":"2019-07-19","color":"green"},{"id":2,"title":"150-300","allDay":"","start":"2019-08-22","end":"2019-08-22","color":"green"},{"id":3,"title":"150-300","allDay":"","start":"2019-08-30","end":"2019-08-30","color":"green"}]

Здесь важно отметить, как указал @ADyson, что формат даты должен быть yyyy-MM-dd (поэтому мой обновленный пост не работал). Если вам нужна дополнительная информация, обратитесь к документации FullCalendar, с которой также связан @ADyson: Анализ событий и События (в виде json фида)

...