Kendo UI Scheduler:仅删除/编辑/更新指定的事件

Posted

技术标签:

【中文标题】Kendo UI Scheduler:仅删除/编辑/更新指定的事件【英文标题】:Kendo UI Scheduler: Delete/Edit/Update only specified events 【发布时间】:2014-07-16 08:36:52 【问题描述】:

我正在使用 Kendo Scheduler,用户可以在我的本地数据库中创建、删除、更新、编辑事件。但我在这个 webapp 上与不同的用户合作,所以我只希望这些用户能够编辑、删除和更新他们个人创建的事件。所以用户 1 可以删除用户 1 创建的事件,但不能删除用户 2 或 3 等创建的事件...

我以为我只是修改模型/控制器来检查登录用户的用户 ID 与事件数据库中的用户 ID。

public virtual JsonResult Meetings_Destroy([DataSourceRequest] DataSourceRequest request, MeetingViewModel meeting)

    var userid = System.Convert.ToInt32(Session["userID"]);

    if (ModelState.IsValid)
        
            if (meeting.UserID== userid)
            
                meetingService.Delete(meeting, ModelState);
            
            else
            
                "cant delete"
            
        

    return Json(new[]  meeting );

但这似乎不起作用,当单击删除事件消失但重新加载后,您会看到它实际上并没有真正从数据库中删除......这当然不是一个好的解决方案,因为目标当然是那个用户不能删除那个事件。

有什么想法吗?


查看

$(function () 
    $("#scheduler").kendoScheduler(
        date: new Date(Date.now()),
        startTime: new Date(2013, 5, 13, 9, 0, 0, 0),
        height: 800,
        timezone: "Etc/UTC",
        dataSource: 
            transport: 
                read: 
                    url: "@Url.Action("Meetings_Read", "Home")",
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    type: "POST"
                ,
                update: 
                    url: "@Url.Action("Meetings_Update", "Home")",
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    type: "POST"
                ,
                create: 
                    url: "@Url.Action("Meetings_Create", "Home")",
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    type: "POST"
                ,
                destroy: 
                    url: "@Url.Action("Meetings_Destroy", "Home")",
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    type: "POST"
                ,
                parameterMap: function (options, operation) 
                    if (operation === "read") 
                        var scheduler = $("#scheduler").data("kendoScheduler");
                        var result = 
                            start: scheduler.view().startDate(),
                            end: scheduler.view().endDate()
                        
                        return kendo.stringify(result);
                    
                    return kendo.stringify(options);
                
            ,
            error: error_handler,
                schema: 
                    model: 
                        id: "MeetingID",
                        fields: 
                            MeetingID:  type: "number" ,
                            title:  from: "Title", type: "string", defaultValue: "No title", validation:  required: true  ,
                            description:  from: "Description", type: "string" ,
                            start:  from: "Start", type: "date" ,
                            startTimezone:  from: "StartTimezone", type: "string" ,
                            end:  from: "End", type: "date" ,
                            endTimezone:  from: "EndTimezone", type: "string" ,
                            recurrenceRule:  from: "RecurrenceRule", type: "string" ,
                            recurrenceId:  from: "RecurrenceID", type: "number", defaultValue: null ,
                            recurrenceException:  from: "RecurrenceException", type: "string" ,
                            isAllDay:  from: "IsAllDay", type: "boolean" ,
                            Timezone:  type: "string" ,
                            RoomID:  type: "number", defaultValue: null ,
                            Attendees:  type: "object" 
                        
                    
                

            ,

        );
    );

JAVASCRIPT

<script type="text/javascript">
    function error_handler(e) 
        if (e.errors) 
            var scheduler = $("#scheduler").data("kendoScheduler");
            scheduler.one("dataBinding", function (e) 
                e.preventDefault();
                for (var error in e.errors) 
                    alert("can't delete")
                
            )
            var message = "Errors:\n";
            $.each(e.errors, function (key, value) 
                if ('errors' in value) 
                    $.each(value.errors, function () 
                        message += this + "\n";
                    );
                
            );
            alert(message);
        
    

控制器

   public virtual JsonResult Meetings_Destroy([DataSourceRequest] DataSourceRequest request, MeetingViewModel meeting)
    
            if (ModelState.IsValid)
            
                if(meeting.UserID == System.Convert.ToInt32(Session["userID"]))
                
                meetingService.Delete(meeting, ModelState);
                
                else
                
                ModelState.AddModelError("","cant delete");
                
            

        return Json(new[]  meeting );
    

【问题讨论】:

可以说不看你的AJAX代码 没有自定义ajax代码,只使用telerik的开源脚本 【参考方案1】:

我的项目也有类似的情况,我的用户在日历上做事的权限有限。我发现您必须防止用户不应该做的添加、编辑和删除之类的事情,您可以使用 JavaScript 事件来做到这一点。然后,在 JavaScript 函数中,如果满足(或不满足)条件,则调用 e.preventDefault();方法。 Here's the demo on Client Events.

查看 (html 5 sn-p)

remove: RemoveMe,
edit: EditMe,
add: AddMe,

查看(MVC版本sn-p)

.Events(events =>

    events.Add("AddMe").Edit("EditMe").Remove("RemoveMe");
)

JavaScript

function AddMe (e) 
    if (SomeValue != SomeOtherValue) 
       e.preventDefault();
;

function EditMe (e) 
    if (SomeValue != SomeOtherValue) 
       e.preventDefault();
;

function RemoveMe (e) 
    if (SomeValue != SomeOtherValue) 
       e.preventDefault();
;

所以,好消息是这会阻止日历显示更新(无论是否发生删除),但不会阻止删除提示(又名。“您确定要删除此事件吗?” )。防止客户端上的操作是要走的路,您可以将警报或通知扩展到屏幕(因为无论如何您都会在 JavaScript 函数中遇到条件),所有这些都是为了通知用户他们不能做某事。

【讨论】:

感谢您的回答,但是当使用它时,它与上面的问题相同,该事件没有被删除,但看起来确实如此,因为它从调度程序中消失,但在重新加载后再次出现......而且删除提示确实还在显示【参考方案2】:

ModelState.AddModelError("cant delete"); return Json(ModelState.ToDataSourceResult());

在视图中

.Read("Grouping_Horizontal_Read", "Scheduler")
        .Create("Grouping_Horizontal_Create", "Scheduler")
        .Destroy("Grouping_Horizontal_Destroy", "Scheduler")
        .Update("Grouping_Horizontal_Update", "Scheduler")
        .Events(events => events.Error("error"))

.Events(events => events.Error("error")) 是诀窍,现在对错误很重要

function error(args) 
    if (args.errors) 

        var scheduler = $("#scheduler").data("kendoScheduler");
        scheduler.one("dataBinding", function (e) 
            e.preventDefault();   // cancel scheduler rebind if error occurs

            for (var error in args.errors) 

                alert(error + " args: " + args.errors[error].errors[0])

            
        );
        args.sender.cancelChanges();
    

【讨论】:

返回 Json(ModelState.ToDataSourceResult());下 ModelState.AddModelError("","cant Delete") 你能把这个:,error: error_handler改成这个error: error_handler,,这是一个交通事件。 没必要,当发生其他错误时,我确实会收到一条消息,但在删除另一个用户的事件时却没有...修改它以匹配您的请求但仍然相同:用户可以删除任何看起来像是被删除但重新加载后再次出现的记录。 sry 看不到其他对我有用的东西。如果错误事件被触发,preventDefault 应该停止绑定事件,因此不会更改集合。 args.sender.cancelChanges(); 在错误事件结束时。它没有出现诅咒我没有做拖放;)抱歉迟到了【参考方案3】:

这也取决于您如何创建会议。

因为要移除一个任务,您只需要一个唯一的 ID。

现在它只是在 JSON 中被删除,而不是在后端数据库中,因为我猜 meeting.id 与触发 create 事件时生成的 taskID 不匹配。

当在调度程序中创建任务时,我建议将 taskID 保存在 ViewBag、SQL 表或其他地方。然后在触发 remove 事件时将此 id 作为参数传递给您的 Meetings_Destroy 方法。

并且 [如上一个答案所述] 使用 JavaScript 删除事件来验证登录用户,因为 e.preventDefault() 可用于限制在不满足条件时触发 Meetings_Destroy 方法。如果在控制器方法 [Meetings_Destroy] 处进行了调试,它将从调度程序中删除事件[在数据库中是否成功删除],即从前端,但会在页面刷新时将其带回。

【讨论】:

【参考方案4】:

我也有同样的情况。我采取了不同的方法来解决它。在编辑功能中,我比较了任务 ID 和当前用户 ID,然后我只是隐藏了那些按钮保存、取消和删除。这些按钮只有创建该按钮的用户才能使用。

function(e) 

    var customHide13= $(".k-scheduler-update, .k-scheduler-delete, .k-scheduler-cancel");

    if (taskId == userId)
        customHide13.show();
    else
        customHide13.hide();
,

【讨论】:

以上是关于Kendo UI Scheduler:仅删除/编辑/更新指定的事件的主要内容,如果未能解决你的问题,请参考以下文章

Kendo UI Scheduler 禁用删除确认或更改其内容

Kendo Scheduler删除其他月份的Line

Kendo UI Scheduler:营业时间?

Kendo UI Scheduler:如何创建自定义模板

如何删除我不想显示的部分 Kendo UI 调度程序?

我想在 Header 更改 Kendo ui Scheduler 的日期格式