2

在我的 Sitecore 应用程序中,我有以下陈述。

using (new Sitecore.SecurityModel.SecurityDisabler())
    {
       Item item = database.GetItem(itemId);
       if (item != null)
       {
          item.Delete();
       }
    }

item对象不为空,并且在item.Delete();语句中发生错误。谁能告诉这个问题有什么问题?

更新: 堆栈跟踪

    at Sitecore.Tasks.ItemEventHandler.OnItemDeleted(Object sender, EventArgs args)
    at Sitecore.Events.Event.EventSubscribers.RaiseEvent(String eventName, Object[] parameters, EventResult result)
    at Sitecore.Events.Event.EventSubscribers.RaiseEvent(String eventName, Object[] parameters)
    at Sitecore.Events.Event.RaiseEvent(String eventName, Object[] parameters)
    at Sitecore.Events.Event.RaiseItemDeleted(Object sender, ItemDeletedEventArgs args)
    at Sitecore.Events.Event.DataEngine_ItemDeleted(Object sender, ExecutedEventArgs`1 e)
    at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
    at Sitecore.Data.Engines.EngineCommand`2.RaiseExecuted()
    at Sitecore.Data.Engines.EngineCommand`2.Executed()
    at Sitecore.Data.Engines.EngineCommand`2.Execute()
    at Sitecore.Data.Engines.DataEngine.DeleteItem(Item item)
    at Sitecore.Data.Managers.ItemProvider.DeleteItem(Item item, SecurityCheck securityCheck)
    at Sitecore.Data.Managers.ItemManager.DeleteItem(Item item)
    at Sitecore.Data.Items.Item.Delete(Boolean removeBlobs)
    at Sitecore.Data.Items.Item.Delete()

我进一步发现该项目实际上已从 Sitecore 树中删除,然后给出了错误。

4

3 回答 3

1

item.Delete() 将 Object reference not set to an instance of an object error in Sitecore

由于安全原因,通常会发生这种情况。可能被模拟的用户没有对该项目的读取权限,或者该项目需要权限才能被删除。

研究使用 SecurityDisabler 和 UserSwitcher。

在食谱中,您可以看到对此类问题的参考: http: //sdn.sitecore.net/upload/sitecore6/content_api_cookbook-a4.pdf

整个 PDF 中有几个禁用程序片段。例如第 12 页。

第 47 页也谈到了这个错误。

我仍然发现使用 SecurityDisabler 的某些情况不起作用。我有一个示例,其中安全性明确禁止普通用户删除。只有管​​理员有能力这样做。在这种情况下,即使我正在使用 securityDisabler,我仍然会收到您遇到的错误:

/////SNIPPET

 ...

  string userName = @"sitecore\[A USER]";
                    if (Sitecore.Security.Accounts.User.Exists(userName))
                    {
  Sitecore.Security.Accounts.User user = Sitecore.Security.Accounts.User.FromName(userName, false);
                        //using (new Sitecore.Security.Accounts.UserSwitcher(user))
                        using (new Sitecore.SecurityModel.SecurityDisabler())
                        {
                            using (new Sitecore.Security.Accounts.UserSwitcher(user))
                            {
                               //DO SOMETHING
                             }
                         }
                     }



 ////END OF SNIPPET

祝你的代码好运。

问候,

于 2014-06-11T15:41:18.667 回答
0

我记得我前段时间遇到过这个问题,我用 BeginEdit() 和 EndEdit() 解决了这个问题。这有点奇怪,但它有效。您可以将代码更改为:

using (new Sitecore.SecurityModel.SecurityDisabler())
{
   Item item = database.GetItem(itemId);
   if (item != null)
   {
      item.Editing.BeginEdit();
      item.Delete();
      item.Editing.EndEdit();
   }
}
于 2013-07-12T10:17:24.313 回答
0

触发异常 Sitecore.Tasks.ItemEventHandler.OnItemDeleted 的方法试图从“taskdatabase”中删除该项目的“Itemstaks”所以我能猜到这个错误的唯一原因是你的配置有问题。您的配置文件或包含文件中有此部分吗?:

<TaskDatabase type="Sitecore.Data.$(database).$(database)TaskDatabase, Sitecore.Kernel">
  <param connectionStringName="core" />
</TaskDatabase>

相关的连接字符串是否可用?

于 2013-11-21T17:09:39.680 回答