feat: add Scheduler CRUD example for RazorPages
This commit is contained in:
Родитель
7e95bf6fc4
Коммит
47458724e4
|
@ -0,0 +1,37 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Telerik.Examples.RazorPages.Models
|
||||||
|
{
|
||||||
|
public class DateGreaterThanAttribute : ValidationAttribute
|
||||||
|
{
|
||||||
|
private const string DEFAULT_ERROR_MSG_TEMPLATE = "{0} should be after {1}";
|
||||||
|
|
||||||
|
public DateGreaterThanAttribute()
|
||||||
|
{
|
||||||
|
if (String.IsNullOrEmpty(ErrorMessage))
|
||||||
|
{
|
||||||
|
ErrorMessage = DEFAULT_ERROR_MSG_TEMPLATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
|
||||||
|
{
|
||||||
|
DateTime? date = value != null ? (DateTime?)value : null;
|
||||||
|
var otherValue = validationContext.ObjectType.GetProperty(OtherField).GetValue(validationContext.ObjectInstance);
|
||||||
|
DateTime? otherDate = otherValue != null ? (DateTime?)otherValue : null;
|
||||||
|
if (date.HasValue && otherDate.HasValue && otherDate > date)
|
||||||
|
{
|
||||||
|
return new ValidationResult(String.Format(ErrorMessage, validationContext.DisplayName, OtherField));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ValidationResult.Success;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public string OtherField { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
using Kendo.Mvc.UI;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Telerik.Examples.RazorPages.Models
|
||||||
|
{
|
||||||
|
public class MeetingViewModel : ISchedulerEvent
|
||||||
|
{
|
||||||
|
public int MeetingID { get; set; }
|
||||||
|
|
||||||
|
[Required]
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
private DateTime start;
|
||||||
|
[Required]
|
||||||
|
public DateTime Start
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
start = value.ToUniversalTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StartTimezone { get; set; }
|
||||||
|
|
||||||
|
private DateTime end;
|
||||||
|
|
||||||
|
[Required]
|
||||||
|
[DateGreaterThan(OtherField = "Start")]
|
||||||
|
public DateTime End
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
end = value.ToUniversalTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string EndTimezone { get; set; }
|
||||||
|
|
||||||
|
public string RecurrenceRule { get; set; }
|
||||||
|
public int? RecurrenceID { get; set; }
|
||||||
|
public string RecurrenceException { get; set; }
|
||||||
|
public bool IsAllDay { get; set; }
|
||||||
|
public string Timezone { get; set; }
|
||||||
|
public int? RoomID { get; set; }
|
||||||
|
public IEnumerable<int> Attendees { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
@page
|
||||||
|
@model Telerik.Examples.RazorPages.Pages.Scheduler.SchedulerCrudOperationsModel
|
||||||
|
@{
|
||||||
|
ViewData["Title"] = "SchedulerCrudOperations";
|
||||||
|
}
|
||||||
|
|
||||||
|
@using Kendo.Mvc.UI
|
||||||
|
|
||||||
|
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
|
||||||
|
@Html.AntiForgeryToken()
|
||||||
|
|
||||||
|
@(Html.Kendo().Scheduler<Telerik.Examples.RazorPages.Models.MeetingViewModel>()
|
||||||
|
.Name("scheduler")
|
||||||
|
.Height(600)
|
||||||
|
.Views(views =>
|
||||||
|
{
|
||||||
|
views.DayView();
|
||||||
|
views.WeekView(weekView => weekView.Selected(true));
|
||||||
|
views.MonthView();
|
||||||
|
views.AgendaView();
|
||||||
|
})
|
||||||
|
.Timezone("Etc/UTC")
|
||||||
|
.Resources(resource =>
|
||||||
|
{
|
||||||
|
resource.Add(m => m.RoomID)
|
||||||
|
.Title("Room")
|
||||||
|
.DataTextField("Text")
|
||||||
|
.DataValueField("Value")
|
||||||
|
.DataColorField("Color")
|
||||||
|
.BindTo(new[] {
|
||||||
|
new { Text = "Meeting Room 101", Value = 1, Color = "#6eb3fa" },
|
||||||
|
new { Text = "Meeting Room 201", Value = 2, Color = "#f58a8a" }
|
||||||
|
});
|
||||||
|
resource.Add(m => m.Attendees)
|
||||||
|
.Title("Attendees")
|
||||||
|
.Multiple(true)
|
||||||
|
.DataTextField("Text")
|
||||||
|
.DataValueField("Value")
|
||||||
|
.DataColorField("Color")
|
||||||
|
.BindTo(new[] {
|
||||||
|
new { Text = "Alex", Value = 1, Color = "#f8a398" },
|
||||||
|
new { Text = "Bob", Value = 2, Color = "#51a0ed" },
|
||||||
|
new { Text = "Charlie", Value = 3, Color = "#56ca85" }
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.DataSource(d => d
|
||||||
|
.Model(m =>
|
||||||
|
{
|
||||||
|
m.Id(f => f.MeetingID);
|
||||||
|
m.Field(f => f.Title).DefaultValue("No title");
|
||||||
|
m.Field(f => f.Attendees).DefaultValue(1);
|
||||||
|
m.RecurrenceId(f => f.RecurrenceID);
|
||||||
|
})
|
||||||
|
.Events(e => e.Error("error_handler"))
|
||||||
|
.Read(read=>read.Url(Url.Page("SchedulerCrudOperations","Meetings_Read")).Data("forgeryToken"))
|
||||||
|
.Create(create=>create.Url(Url.Page("SchedulerCrudOperations","Meetings_Create")).Data("forgeryToken"))
|
||||||
|
.Destroy(destroy=>destroy.Url(Url.Page("SchedulerCrudOperations","Meetings_Destroy")).Data("forgeryToken"))
|
||||||
|
.Update(u=>u.Url(Url.Page("SchedulerCrudOperations","Meetings_Update")).Data("forgeryToken"))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function forgeryToken() {
|
||||||
|
return kendo.antiForgeryTokens();
|
||||||
|
}
|
||||||
|
|
||||||
|
function error_handler(e) {
|
||||||
|
if (e.errors) {
|
||||||
|
var message = "Errors:\n";
|
||||||
|
$.each(e.errors, function (key, value) {
|
||||||
|
if ('errors' in value) {
|
||||||
|
$.each(value.errors, function () {
|
||||||
|
message += this + "\n";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
alert(message);
|
||||||
|
|
||||||
|
var scheduler = $("#scheduler").data("kendoScheduler");
|
||||||
|
scheduler.one("dataBinding", function (e) {
|
||||||
|
//prevent saving if server error is thrown
|
||||||
|
e.preventDefault();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Kendo.Mvc.Extensions;
|
||||||
|
using Kendo.Mvc.UI;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||||
|
using Telerik.Examples.RazorPages.Models;
|
||||||
|
|
||||||
|
namespace Telerik.Examples.RazorPages.Pages.Scheduler
|
||||||
|
{
|
||||||
|
public class SchedulerCrudOperationsModel : PageModel
|
||||||
|
{
|
||||||
|
public static IList<MeetingViewModel> meetings;
|
||||||
|
|
||||||
|
public void OnGet()
|
||||||
|
{
|
||||||
|
if (meetings == null)
|
||||||
|
{
|
||||||
|
meetings = new List<MeetingViewModel>();
|
||||||
|
Enumerable.Range(1, 5).ToList().ForEach(x => meetings.Add(new MeetingViewModel()
|
||||||
|
{
|
||||||
|
MeetingID = x,
|
||||||
|
Title = "Event " + x,
|
||||||
|
Start = DateTime.Now.AddHours(x * 2),
|
||||||
|
End = DateTime.Now.AddHours(x * 3),
|
||||||
|
Description = "Description for event " + x,
|
||||||
|
Attendees = new List<int>() { (x % 3) +1 }
|
||||||
|
})); ;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual JsonResult OnPostMeetings_Read([DataSourceRequest] DataSourceRequest request)
|
||||||
|
{
|
||||||
|
return new JsonResult(meetings.ToDataSourceResult(request));
|
||||||
|
}
|
||||||
|
public virtual JsonResult OnPostMeetings_Destroy([DataSourceRequest] DataSourceRequest request, MeetingViewModel meeting)
|
||||||
|
{
|
||||||
|
if (ModelState.IsValid)
|
||||||
|
{
|
||||||
|
meetings.Remove(meetings.First(x => x.MeetingID == meeting.MeetingID));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new JsonResult(new[] { meeting }.ToDataSourceResult(request, ModelState));
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual JsonResult OnPostMeetings_Create([DataSourceRequest] DataSourceRequest request, MeetingViewModel meeting)
|
||||||
|
{
|
||||||
|
if (ModelState.IsValid)
|
||||||
|
{
|
||||||
|
meeting.MeetingID = meetings.Count + 2;
|
||||||
|
meetings.Add(meeting);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new JsonResult(new[] { meeting }.ToDataSourceResult(request, ModelState));
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual JsonResult OnPostMeetings_Update([DataSourceRequest] DataSourceRequest request, MeetingViewModel meeting)
|
||||||
|
{
|
||||||
|
if (ModelState.IsValid)
|
||||||
|
{
|
||||||
|
meetings.Where(x => x.MeetingID == meeting.MeetingID).Select(x => meeting);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new JsonResult(new[] { meeting }.ToDataSourceResult(request, ModelState));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче