2016-07-21 9 views
0

Also versuche ich zu verhindern, dass jemand ein Objekt kopiert oder in einen Ordner verschiebt, es sei denn, es hat eine bestimmte Vorlage. Ich entschied, dass ich einen benutzerdefinierten Event-Handler für Element: erstellt und Element: Verschieben erstellen würde. Im Fall von Artikel: erstellt, wenn der Artikel vom falschen Typ ist, lösche ich ihn einfach. Im Fall von "item: moving" verlasse ich gerade den Move-Vorgang.Fehler beim Versuch, ein Objekt in Sitecore zu löschen

Ich habe den folgenden Code für das Element: erstellte Veranstaltung jetzt:

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"); 

          } 

         } 
        } 
       } 

      } 
     } 

Der Artikel gelöscht erhalten, jedoch eine Fehlermeldung erscheint ohne Meldung auf. Hier ist der Stack-Trace:

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 

Hat jemand eine Idee, was das verursacht?

Danke.

+1

Warum Verwenden Sie das bewegte Ereignis und nicht das Erstellen? Könnte einfacher sein .. – Gatogordo

+1

Versuchen Sie, Ihre Veranstaltung auf Artikel: Erstellen statt Artikel: erstellt. – Anton

Antwort

0

Genau wie andere gesagt, Sie verwenden müssen, um Artikel: Erstellen von Ereignis statt, hier ist das, was Sie tun müssen:

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"); 

          } 

         } 
        } 
       } 

      } 
     } 
    } 
    } 

Und für die Konfigurationen, sollten Sie haben:

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

Ich habe getan, wie Sie angewiesen haben, aber aus irgendeinem Grund wird mein Code jetzt überhaupt nicht ausgeführt ... löst "Copy To" den Gegenstand nicht aus: Ereignis erstellen? Ich habe meinen Handler unter Item platziert: Erstelle und überprüfe alles, also bin ich mir nicht sicher, was gerade passiert. – user3298634

+0

@ user3298634 Wird der Code beim Erstellen eines neuen Elements ausgeführt? Wenn nicht, dann können Sie versuchen, item: copy event zu verwenden und zu sehen, ob es –

+0

aufgerufen wird. Das Element create event wird nie ausgelöst. Ich habe das Ereignis-Timing auf "high" gesetzt und die Logs überprüft, um sicherzugehen. Ich habe schließlich einen Handler für den Artikel erstellt: Kopieren – user3298634