item.Delete()使Object引用未设置为Sitecore中对象错误的实例

时间:2013-07-12 09:14:25

标签: sitecore sitecore6 object-reference

在我的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树中删除,然后发出错误。

3 个答案:

答案 0 :(得分:1)

item.Delete() gives 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

祝你的代码好运。

此致

答案 1 :(得分:0)

我记得很久以前我遇到过这个问题,我用BeginEdit()和EndEdit()解决了这个问题。它有点奇怪,但它的工作原理。 您能否将代码更改为:

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

答案 2 :(得分:0)

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

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

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