C# 剑道UI计划程序:仅删除/编辑/更新指定的事件

C# 剑道UI计划程序:仅删除/编辑/更新指定的事件,c#,asp.net-mvc,kendo-ui,kendo-scheduler,kendo-ui-mvc,C#,Asp.net Mvc,Kendo Ui,Kendo Scheduler,Kendo Ui Mvc,我和剑道调度器一起工作,用户可以创建、删除、更新、编辑我的本地数据库中的事件。但我在这个webapp上与不同的用户合作,所以我只希望这些用户能够编辑、删除和更新他们个人创建的事件。所以用户1可以删除用户1创建的事件,但不能删除用户2或3创建的事件,等等 我想我只是修改了模型/控制器,以检查登录用户的userID与事件数据库中的userID public virtual JsonResult Meetings_Destroy([DataSourceRequest] DataSourceReques

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

我想我只是修改了模型/控制器,以检查登录用户的userID与事件数据库中的userID

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 });
}
但这似乎不起作用,当单击delete时,事件消失,但在重新加载后,您会看到它实际上并没有从db中删除。。。这当然不是一个好的解决方案,因为目标当然是用户不能删除该事件

有什么想法吗


查看

$(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);
        }
    }

ModelState.addmodeleror(“无法删除”);
返回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();
    }
}

ModelState.addmodeleror(“无法删除”);
返回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();
    }
}

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

查看(HTML 5代码段)

查看(MVC版本片段)

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函数中遇到这种情况),所有这些都是为了通知用户他们不能做一些事情。

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

查看(HTML 5代码段)

查看(MVC版本片段)

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函数中会有这种情况),所有这些都是为了通知用户他们不能做什么。

这也取决于您创建会议的方式

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

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

我建议在计划程序中创建任务时,将taskID保存在ViewBag、SQL表或其他地方。然后在触发remove事件时,将此id作为参数传递给Meetings\u Destroy方法


并且[如前一个回答中所述]使用JavaScript remove事件来验证登录用户,因为e.preventDefault()可以用于限制在不满足条件的情况下触发的Destroy方法。如果在控制器方法[Meetings\u Destroy]中达到调试,它将从调度程序中删除事件[在数据库中是否成功删除],即从前端删除,但会在页面刷新时将其恢复。

这也取决于您创建会议的方式

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

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

我建议在计划程序中创建任务时,将taskID保存在ViewBag、SQL表或其他地方。然后在触发remove事件时,将此id作为参数传递给Meetings\u Destroy方法


并且[如前一个回答中所述]使用JavaScript remove事件来验证登录用户,因为e.preventDefault()可以用于限制在不满足条件的情况下触发的Destroy方法。如果在控制器方法[Meetings\u Destroy]中达到调试,它将从调度程序中删除事件[在数据库中成功删除或未成功删除],即从前端删除,但会在页面刷新时将其恢复。

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

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

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

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

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

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

可以说没有看到AJAX代码没有任何自定义AJAX代码,只使用telerik的开源脚本;可以说没有看到AJAX代码没有任何自定义AJAX代码,只使用telerik的开源脚本返回Json(ModelState.ToDataSourceResult());在ModelState.addmodeleror(“,”不能删除“)下,可以更改