【问题标题】:DHTMLX Scheduler Recurring Events Controller CodeDHTMLX 调度程序重复事件控制器代码
【发布时间】:2012-11-23 06:28:56
【问题描述】:

我需要在我的 MVC3 项目中执行 DHTMLX 重复事件。对于重复发生的事件,我需要设置我的控制器代码来存储和检索额外的数据库值,如 rec_type、event_pid。

我已经完成了简单事件的基本编码。但我不知道如何为重复发生的事件写作。在演示站点本身中显示它在 PHP 上。这是教程链接 (Here)。请提供 C# 环境的逻辑。

简单事件创建/更新/删除

    public ActionResult Save(Event changedEvent, FormCollection actionValues)
    {
        var a = "Z";
        String action_type = actionValues["!nativeeditor_status"];
        Int64 source_id = Int64.Parse(actionValues["id"]);
        Int64 target_id = source_id;
        string category = actionValues["category"];
        string title = actionValues["title"];
        string description = actionValues["text"];
        if (actionValues["rec_type"] != "")
        {
            changedEvent.Rec_Type = actionValues["rec_type"];
        }
        else
            changedEvent.Rec_Type = "";
        if (actionValues["event_length"] != "")
        {
            changedEvent.Event_Length = Convert.ToInt32(actionValues["event_length"]);
        }
        else
            changedEvent.Event_Length = 0;
        if (actionValues["event_pid"] != "")
        {
            changedEvent.Event_Pid = Convert.ToInt16(actionValues["event_pid"]);
        }
        else
            changedEvent.Event_Pid = 0;
        String catg = category;
        changedEvent.UserId = 1;
        changedEvent.Category = catg;
        changedEvent.Description = description;
        changedEvent.Title = title;
        try
        {
            switch (action_type)
            {
                case "inserted":
                    changedEvent.UserId = 1;
                    changedEvent.Category = catg;
                    db.Events.AddObject(changedEvent);

                    break;
                case "deleted":
                    changedEvent = db.Events.SingleOrDefault(ev => ev.Id == source_id);
                    db.Events.DeleteObject(changedEvent);
                    break;
                default: // "updated"
                    db.Events.Attach(changedEvent);
                    db.ObjectStateManager.ChangeObjectState(changedEvent, System.Data.EntityState.Modified);
                    db.SaveChanges();
                    break;
            }
            db.SaveChanges();
            target_id = changedEvent.Id;
        }
        catch
        {
            action_type = "error";
        }

        return View(new CalendarActionResponseModel(action_type, source_id, target_id, catg));
    }

谢谢。

【问题讨论】:

    标签: asp.net-mvc-3 dhtmlx


    【解决方案1】:

    数据的检索应该与简单事件相同,除了您将呈现 3 个额外字段 - event_length、event_pid、rec_type。 rec_type 的默认值(这意味着事件不会重复)是 null 的空字符串

    至于保存,请查看本文的“控制器更改”段落,它可能会有所帮助 http://scheduler-net.com/docs/recurring_events.html#controller_changes

    虽然它针对.Net的dhtmlxScheduler,是独立的组件,但处理逻辑是一样的。

    一般来说,重复事件的保存方式与简单事件的保存方式相同(相同的方法可以处理简单和重复事件),但您需要为以下情况添加额外的逻辑:

    1. 如果插入带有 (rec_type == "none") 的事件 - 响应必须具有“已删除”状态;
    2. 如果具有 (!string.IsNullOrEmpty(rec_type) && rec_type != "none") 的事件被更新或删除 - 必须删除具有相关 event_pid 的所有记录;
    3. 如果删除了具有非默认 event_pid 值的事件 - 需要使用 rec_type = "none" 进行更新,而不是删除。

    UPD,代码示例

    最终的代码可能如下所示(我没有实际运行过,所以可能包含一些错误),

    与简单版本相比,所有更改是“deleteRelated”方法(请注意,如果 deleteRelated 返回 true,则应省略 switch-case)和在“插入”情况下检查 Rec_Type

    public ActionResult Save(Event changedEvent, FormCollection actionValues){
        String action_type = actionValues["!nativeeditor_status"];
        Int64 source_id = Int64.Parse(actionValues["id"]);
        Int64 target_id = source_id;
        string category = actionValues["category"];
        string title = actionValues["title"];
        string description = actionValues["text"];
    
    
        if (!string.IsNullOrEmpty(actionValues["rec_type"]))
            changedEvent.Rec_Type = actionValues["rec_type"];
    
        if (!string.IsNullOrEmpty(actionValues["event_length"]))
            changedEvent.Event_Length = Convert.ToInt32(actionValues["event_length"]);
    
        if (!string.IsNullOrEmpty(actionValues["event_pid"]))
            changedEvent.Event_Pid = Convert.ToInt16(actionValues["event_pid"]);
    
        String catg = category;
        changedEvent.UserId = 1;
        changedEvent.Category = catg;
        changedEvent.Description = description;
        changedEvent.Title = title;
        try
        {
            if (!deleteRelated(action_type, changedEvent, db))//some logic specific for recurring events
            {
                switch (action_type)
                {
                    case "inserted":
                        changedEvent.UserId = 1;
                        changedEvent.Category = catg;
                        db.Events.AddObject(changedEvent);
    
                        if (changedEvent.Rec_Type == "none")
                            action_type = "deleted";//if an event with (rec_type == "none") was inserted - the response must have "deleted" status
    
                        break;
                    case "deleted":
                        changedEvent = db.Events.SingleOrDefault(ev => ev.Id == source_id);
                        db.Events.DeleteObject(changedEvent);
                        break;
                    default: // "updated"
                        db.Events.Attach(changedEvent);
                        db.ObjectStateManager.ChangeObjectState(changedEvent, System.Data.EntityState.Modified);
                        db.SaveChanges();
                        break;
                }
            }
            db.SaveChanges();
            target_id = changedEvent.Id;
        }
        catch
        {
            action_type = "error";
        }
    
        return View(new CalendarActionResponseModel(action_type, source_id, target_id, catg));
    }
    protected bool deleteRelated(string action_type, Event changedEvent, RecurringEntities db)//
    {
        bool finished = false;
        if ((action_type == "deleted" || action_type == "updated")
            && !string.IsNullOrEmpty(changedEvent.Rec_Type))
        {
            //if an event with (!string.IsNullOrEmpty(rec_type) && rec_type != "none") was updated or deleted - all records with the related event_pid must be deleted;
            db.ExecuteStoreCommand("DELETE FROM Films WHERE Event_Pid = {0}", changedEvent.Id);
        }
        if (action_type == "deleted"
                && (changedEvent.Event_Pid != 0 && changedEvent.Event_Pid != default<Int16>))
        {
            //if an event with non-default event_pid value was deleted - it need to be updated with rec_type = "none" instead of deleting.
            var item = db.Events.SingleOrDefault(ev => ev.Id == changedEvent.Id);
            item.Rec_Type = "none";
            db.SaveChanges();
            finished = true; //in this case no more processing is needed
        }
        return finished;
    }
    

    【讨论】:

    • 在 .Net 示例教程页面的 dhtmlxScheduler 中,他们使用了内置的 dll 库和函数来提取一些值。我无法为灯箱设置制定自己的逻辑。你能给我提供更详细的信息吗?我将在此处附上我的简单事件代码。
    猜你喜欢
    • 2015-03-30
    • 2018-05-25
    • 2019-09-30
    • 2021-10-18
    • 2019-07-27
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多