2012-12-05 31 views
0

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

我已经完成了简单事件的基本编码。但我不知道如何编写周期性事件。演示网站本身在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)); 
    } 

感谢。

回答

0

检索数据应该和简单事件一样,除了你会渲染3个额外的字段 - event_length,event_pid,rec_type。 rec_type的默认值(这将意味着该事件不重复)是空的空字符串

至于储蓄,勾选“控制器改变”本条第一款,它可以帮助 http://scheduler-net.com/docs/recurring_events.html#controller_changes

虽然它的目标.html的dhtmlxScheduler是独立的组件,处理逻辑是相同的。

一般情况下,反复出现的事件将工作方式一样简单的人(同样的方法可以处理简单的和经常性的事件),但你需要添加额外的逻辑是以下情况时的保存:

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

UPD,代码示例

最后的代码可能看起来像下面的(我没有真正运行它,所以它可能包含一些错误),

所有变化,比较简单版本,是“deleteRelated”方法(请注意,如果deleteRelated返回true,开关壳体应该省略),并在“插入”的情况下的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; 
} 
+0

在dhtmlxSched他们使用的.Net示例教程页面内置了dll库文件,并提供了一些提取值的函数。我无法为灯箱设置制作自己的逻辑。你能否提供更详细的信息?我将在这里附上我的简单事件代码。 – Dheyv