所以我试图阻止某人将项目复制或移动到文件夹中,除非它有某个模板。我决定为item创建一个自定义事件处理程序:created:item:moving。对于item:如果项目类型错误,则创建我只是删除它。在item:moving的情况下,我只是退出移动操作。
我有以下代码:现在创建的事件:
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
有没有人知道造成这种情况的原因是什么?
感谢。
答案 0 :(得分:0)
就像其他人说的那样,你需要使用item:创建事件,这是你需要做的:
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>