C# Sitecore内容树显示“;“图像”;使用自定义数据提供程序插入后的项
按照以下步骤实现自定义读写提供程序。 问题是在内容树中插入一个新项目时,它会显示该项目的两个副本,另一个基本上是“图像”,即相同的ID,无法编辑,甚至不能单击该“图像”项目。但对真实项目的任何更改都将显示在“图像”项目上(编辑、删除)。我还检查了外部数据库(SQL Server)表,只创建了一条记录。所以,问题在于Sitecore如何在内容树下两次显示该项目 对不起,我没有足够的声誉来发布screeshot 方法代码:C# Sitecore内容树显示“;“图像”;使用自定义数据提供程序插入后的项,c#,.net,sitecore,dataprovider,northwind,C#,.net,Sitecore,Dataprovider,Northwind,按照以下步骤实现自定义读写提供程序。 问题是在内容树中插入一个新项目时,它会显示该项目的两个副本,另一个基本上是“图像”,即相同的ID,无法编辑,甚至不能单击该“图像”项目。但对真实项目的任何更改都将显示在“图像”项目上(编辑、删除)。我还检查了外部数据库(SQL Server)表,只创建了一条记录。所以,问题在于Sitecore如何在内容树下两次显示该项目 对不起,我没有足够的声誉来发布screeshot 方法代码: public override ItemDefinition GetIt
public override ItemDefinition GetItemDefinition(ID id, CallContext context)
{
ItemDefinition newItem = null;
if (CanProcessChild(id, context))
{
object orifinalID = GetOriginalRecordID(id);
StringBuilder sqlSelect = new StringBuilder();
sqlSelect.AppendFormat("SELECT {0} FROM {1}", nameField, table);
sqlSelect.Append(GetConditions(orifinalID));
string[] result = SqlUtil.GetStringArray(sqlSelect.ToString(), connectionString);
if (result.Length > 0)
{
string itemName = result[0];
if (string.IsNullOrEmpty(itemName))
{
itemName = "unnamed item";
}
newItem = new ItemDefinition(id, itemName, MainDB.Templates[new ID(templateID)].ID, ID.Null);
((ICacheable)newItem).Cacheable = false;
}
}
return newItem;
}
public override FieldList GetItemFields(ItemDefinition item, VersionUri version, CallContext context)
{
if (CanProcessChild(item.ID, context))
{
if (context.DataManager.DataSource.ItemExists(item.ID))
{
ReflectionUtil.CallMethod(
typeof(ItemCache), CacheManager.GetItemCache(context.DataManager.Database),
"RemoveItem", true, true, new object[] { item.ID });
}
CoreItem.Builder builder = CreateItemBuilder(item, context.DataManager);
return builder.ItemData.Fields;
}
return null;
public override bool CreateItem(ID itemID, string itemName, ID tempID, ItemDefinition parent, CallContext context)
{
if (new ID(templateID) == tempID && new ID(parentItemID) == parent.ID)
{
string fields = GetFieldsName();
StringCollection valuesBuilder = new StringCollection();
foreach (string field in fieldNames)
{
if (field == nameField)
{
valuesBuilder.Add(String.Format("'{0}'", itemName));
continue;
};
if (field == idField)
{
valuesBuilder.Add(String.Format("'{0}'", ID.Encode(itemID).Substring(0, 4)));
continue;
};
valuesBuilder.Add("''");
}
string values = StringUtil.StringCollectionToString(valuesBuilder, " ,");
Insert(fields, values);
IDTable.Add(ToString(), ID.Encode(itemID).Substring(0, 4), itemID, parent.ID);
context.Abort();
return true;
}
return false;
}
CoreItem.Builder CreateItemBuilder(ItemDefinition item, DataManager dataManager)
{
CoreItem.Builder result = new CoreItem.Builder(item.ID, item.Name, item.TemplateID, dataManager);
StringBuilder sqlSelect = new StringBuilder();
sqlSelect.AppendFormat("SELECT {0} FROM {1}", fieldsNames, table);
sqlSelect.Append(GetConditions(GetOriginalRecordID(item.ID)));
using (SqlDataReader sqlResult = ExecuteReader(sqlSelect.ToString(), connectionString))
{
if (sqlResult.Read())
{
for (int i = 0; i < sqlResult.FieldCount; i++)
{
result.AddField(sqlResult.GetName(i), ToSitecoreValue(sqlResult.GetValue(i)));
}
}
}
return result;
}
public覆盖项定义GetItemDefinition(ID,CallContext上下文)
{
ItemDefinition newItem=null;
if(CanProcessChild(id,context))
{
object orifinalID=GetOriginalRecordID(id);
StringBuilder sqlSelect=新建StringBuilder();
AppendFormat(“从{1}中选择{0}”,名称字段,表格);
Append(GetConditions(orifinalID));
string[]result=SqlUtil.GetStringArray(sqlSelect.ToString(),connectionString);
如果(result.Length>0)
{
字符串itemName=result[0];
if(string.IsNullOrEmpty(itemName))
{
itemName=“未命名项”;
}
newItem=new ItemDefinition(id,itemName,MainDB.Templates[new id(templateID)].id,id.Null);
((ICacheable)newItem).Cacheable=false;
}
}
返回新项目;
}
公共覆盖字段列表GetItemFields(ItemDefinition项、VersionUri版本、CallContext上下文)
{
if(CanProcessChild(item.ID,context))
{
if(context.DataManager.DataSource.ItemExists(item.ID))
{
ReflectionUtil.CallMethod(
typeof(ItemCache),CacheManager.GetItemCache(context.DataManager.Database),
“RemoveItem”,true,true,新对象[]{item.ID});
}
CoreItem.Builder=CreateItemBuilder(item,context.DataManager);
返回builder.ItemData.Fields;
}
返回null;
public override bool CreateItem(ID itemID、string itemName、ID tempID、ItemDefinition父项、CallContext上下文)
{
if(新ID(templateID)==tempID&&newid(parentItemID)==parent.ID)
{
字符串字段=GetFieldsName();
StringCollection valuesBuilder=新StringCollection();
foreach(字段名中的字符串字段)
{
如果(字段==名称字段)
{
Add(String.Format(“{0}”,itemName));
继续;
};
如果(字段==idField)
{
Add(String.Format(“{0}”,ID.Encode(itemID).Substring(0,4));
继续;
};
valuesBuilder。添加(“”);
}
字符串值=StringUtil.StringCollectionToString(valuesBuilder,“,”);
插入(字段、值);
Add(ToString(),ID.Encode(itemID).Substring(0,4),itemID,parent.ID);
context.Abort();
返回true;
}
返回false;
}
生成器CreateItemBuilder(ItemDefinition项,DataManager DataManager)
{
CoreItem.Builder结果=新的CoreItem.Builder(item.ID、item.Name、item.TemplateID、dataManager);
StringBuilder sqlSelect=新建StringBuilder();
AppendFormat(“从{1}中选择{0}”,字段名称,表格);
Append(GetConditions(GetOriginalRecordID(item.ID));
使用(SqlDataReader sqlResult=ExecuteReader(sqlSelect.ToString(),connectionString))
{
if(sqlResult.Read())
{
对于(int i=0;i
基本上CreateItem方法是直接插入到SQL表中,Sitecore将拾取新插入的项。我发现如果通过Sitecore插入,则在后代表中会创建一行;但是如果从外部数据库表创建,则不会创建这样的行,并且数据将在没有“图像”的情况下正确显示
我是sitecore的新手,不知道这个问题的原因是什么
非常感谢您的帮助!看起来您的内容树同时使用了多个提供商 如果要确保在数据提供程序运行后不会运行后续数据提供程序,请调用传递给数据提供程序的
CallContext
对象上的Abort()
方法
有关Sitecore社区文档中数据提供程序的更多信息
非常感谢您的回复。我确实检查了每个方法,最后都有context.abort();我甚至每次都尝试清除缓存。这些都不起作用:(