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:仅删除/编辑/更新指定的事件的主要内容,如果未能解决你的问题,请参考以下文章