2016-07-21 55 views
0

因此,我試圖阻止某人將項目複製或移動到文件夾中,除非它具有特定的模板。我決定爲item:created和item創建一個自定義事件處理程序:移動。在項目的情況下:如果該項目的類型錯誤,則創建我簡單地刪除它。在物品移動的情況下,我只是退出移動操作。當我嘗試刪除Sitecore中的項目時出錯

我對這一項目的下列代碼:創建的事件現在:

public void OnItemCreated(object sender, EventArgs args) 
    { 
     var createdArgs = Event.ExtractParameter(args, 0) as ItemCreatedEventArgs; 

     Sitecore.Diagnostics.Assert.IsNotNull(createdArgs, "args"); 
     if (createdArgs != null) 
     { 
      Sitecore.Diagnostics.Assert.IsNotNull(createdArgs.Item, "item"); 
      if (createdArgs.Item != null) 
      { 
       var item = createdArgs.Item; 

       if (item.Parent != null) 
       { 
        //see if the item is being placed under a Navigation Item type or under the Navigation folder 
        if (item.Parent.TemplateName == "Navigation Item" || item.ParentID.ToString() == "{6ED240C9-1B69-48E2-9FD9-6C45CD8ABE63}") 
        { 
         if (item.TemplateName != "Navigation Item") 
         { 
          using (new Sitecore.SecurityModel.SecurityDisabler()) 
          { 
           // Delete the item, warn user 
           item.DeleteChildren(); 
           item.Delete(); 

           SheerResponse.Alert("Sorry, you can only add items based on the \"Navigation Item\" template here"); 

          } 

         } 
        } 
       } 

      } 
     } 

該項目不被刪除,但錯誤沒有消息彈出。這裏是堆棧跟蹤:

Server Error in '/' Application. 

    item 

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.InvalidOperationException: item 

    Source Error: 

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

    Stack Trace: 


    [InvalidOperationException: item] 
     Sitecore.Tasks.BaseArchiveTask.Remove() +139 
     Sitecore.Tasks.ItemEventHandler.UpdateArchiving(Item item, Boolean force) +359 
     Sitecore.Tasks.ItemEventHandler.OnItemCopied(Object sender, EventArgs args) +109 
     Sitecore.Events.EventSubscribers.RaiseEvent(String eventName, Object[] parameters, EventResult result) +388 
     Sitecore.Events.Event.RaiseEvent(String eventName, Object[] parameters) +349 
     System.EventHandler`1.Invoke(Object sender, TEventArgs e) +0 
     Sitecore.Data.Engines.EngineCommand`2.RaiseEvent(EventHandler`1 handlers, Func`2 argsCreator) +129 
     Sitecore.Data.Engines.DataCommands.CopyItemCommand.Executed() +21 
     Sitecore.Data.Engines.EngineCommand`2.Execute() +173 
     Sitecore.Data.Managers.ItemProvider.CopyItem(Item source, Item destination, Boolean deep, String copyName, ID copyId) +783 
     Sitecore.Data.Managers.ItemManager.CopyItem(Item source, Item destination, Boolean deep, String copyName, ID copyId) +182 
     Sitecore.Workflows.WorkflowContext.CopyItem(Item item, Item destination, String copyName, ID copyID, Boolean deep) +127 
     Sitecore.Workflows.WorkflowContext.CopyItem(Item item, Item destination, String copyName) +173 
     Sitecore.Shell.Framework.Pipelines.CopyItems.CopyItem(Item target, Item itemToCopy) +135 
     Sitecore.Shell.Framework.Pipelines.CopyItems.Execute(CopyItemsArgs args) +293 

    [TargetInvocationException: Exception has been thrown by the target of an invocation.] 
     System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0 
     System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +128 
     System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +146 
     Sitecore.Pipelines.Processor.Invoke(PipelineArgs args) +364 
     Sitecore.Nexus.Pipelines.NexusPipelineApi.Resume(PipelineArgs args, Pipeline pipeline) +297 
     Sitecore.Web.UI.Sheer.ClientPage.ResumePipeline() +224 
     Sitecore.Web.UI.Sheer.ClientPage.OnPreRender(EventArgs e) +779 
     Sitecore.Shell.Applications.ContentManager.ContentEditorPage.OnPreRender(EventArgs e) +24 
     System.Web.UI.Control.PreRenderRecursiveInternal() +107 
     System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +7675 

有沒有人有任何想法是什麼造成這種情況?

謝謝。

+1

爲什麼你使用移動事件而不是創建?可以更容易.. – Gatogordo

+1

嘗試使項目上的事件:創建而不是項目:創建。 – Anton

回答

0

就像別人說,你需要使用項目:創建事件相反,以下是你需要做什麼:

public class OnItemCreating 
    { 
    public void OnItemCreating(object sender, EventArgs args) 
    { 
     using (new SecurityDisabler()) 
     { 
     ItemCreatingEventArgs arg = Event.ExtractParameter(args, 0) as ItemCreatingEventArgs; 

     if (arg .Item != null) 
      { 
       var item = arg .Item; 

       if (item.Parent != null) 
       { 
        //see if the item is being placed under a Navigation Item type or under the Navigation folder 
        if (item.Parent.TemplateName == "Navigation Item" || item.ParentID.ToString() == "{6ED240C9-1B69-48E2-9FD9-6C45CD8ABE63}") 
        { 
         if (item.TemplateName != "Navigation Item") 
         { 
          using (new Sitecore.SecurityModel.SecurityDisabler()) 
          { 

           ((SitecoreEventArgs)args).Result.Cancel = true; 
           SheerResponse.Alert("Sorry, you can only add items based on the \"Navigation Item\" template here"); 

          } 

         } 
        } 
       } 

      } 
     } 
    } 
    } 

而對於配置,你應該有:

<event name="item:creating"> 
    <handler type="YourNameSpace.OnItemCreating, YourAssembly" method="OnItemCreating" /> 
</event> 
+0

我按照你的指示完成了,但由於某種原因,現在我的代碼並沒有運行......「複製到」不觸發項目:創建事件?我把我的處理程序放在項目下:創建並複查所有內容,所以我不知道現在發生了什麼。 – user3298634

+0

@ user3298634創建新項目時代碼是否被執行?如果沒有,那麼你可以嘗試使用項目:複製事件,看看它是否被稱爲 –

+0

項目:創建事件永遠不會被觸發。我將事件時間設置爲高,並檢查日誌以確保。我最終爲項目創建了一個處理程序:複製 – user3298634

相關問題