在我的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树中删除,然后发出错误。
答案 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>
相关的连接字符串是否可用?