Сохранение значения пользовательского свойства Episerver
У меня есть пользовательское свойство в Episerver, унаследованное от LongString. Значение свойства сохраняется в первый раз и извлекается правильно. Но при последующем сохранении значение не обновляется, перед SaveData() свойства LoadData() продолжают вызывать и сбрасывать значение до старого значения, поэтому новое значение не сохраняется в БД. Я сослался на код для решения Itera.MultiProperty и попытался сравнить поток с этим, но все же не повезло. У меня есть панель обновления в настраиваемом свойстве с управлением повторителем, но страница отправляется обратно и вызывает LoadData() перед сохранением. Я использую Episerver 5.2 R2 SP1. Любые указатели или помощь приветствуется.
public override void LoadData(object value)
{
if (value != null)
_val = value.ToString();
base.LoadData(_val);
}
public override object SaveData(PropertyDataCollection properties)
{
return _val;
}
Санджай Залке
2 ответа
Возможно, уже поздно ответить, но, к счастью, в то время я наткнулся на статью Андерса Хаттестада. Гениальный парень с очень хорошим пониманием EpiServer.
Я унаследовал от его элементов управления и сделал много своих собственных элементов управления, и они работают как шарм.
Благодарю.
Редактировать:
По запросу Билла, вот окончательный код. Ссылка на статью уже размещена выше:)
using System;
using System.Collections.Generic;
using System.Text;
using EPiServer.Core;
using System.Web.UI.WebControls;
using System.Web.UI;
using EPiServer.PlugIn;
using Itera.Property;
using EPiServer.SpecializedProperties;
namespace MyProject.CustomProperties
{
[PageDefinitionTypePlugIn]
public class CategoryList : PropertyMulitBase
{
public CategoryList()
: base()
{
EditOption.Add(EditOptions.ShowTopTabs, true);
}
#region BasePropertys
PropertyDataCollection basePropertys;
public override EPiServer.Core.PropertyDataCollection BasePropertys
{
get
{
if (basePropertys == null)
{
PropertyDataCollection _new = new PropertyDataCollection();
_new.Add("Category", new Category());
basePropertys = _new;
}
return basePropertys;
}
}
#endregion
}
[PageDefinitionTypePlugIn]
public class CategoryItemList : PropertyMulitBase
{
public CategoryItemList()
: base()
{
EditOption.Add(EditOptions.ShowTopTabs, true);
}
#region BasePropertys
PropertyDataCollection basePropertys;
public override EPiServer.Core.PropertyDataCollection BasePropertys
{
get
{
if (basePropertys == null)
{
PropertyDataCollection _new = new PropertyDataCollection();
_new.Add("Category Item", new PropertyPageReference());
basePropertys = _new;
}
return basePropertys;
}
}
#endregion
}
public class Category : PropertySingleBase
{
#region PropertyCollection
PropertyDataCollection innerPropertyCollection;
object lockObject = new object();
protected override PropertyDataCollection InnerPropertyCollection
{
get
{
if (innerPropertyCollection == null)
{
innerPropertyCollection = new PropertyDataCollection();
innerPropertyCollection.Add("Category", new PropertyPageReference());
innerPropertyCollection.Add("Customise", new PropertyBoolean());
innerPropertyCollection.Add("Category Item", new CategoryItemList());
}
return innerPropertyCollection;
}
set
{
innerPropertyCollection = value;
}
}
#endregion
}
}
Добавьте это в папку CustomProperties в вашем проекте.
Я считаю, что вы должны сначала установить PropertyLongString.LongString, а затем вызвать базовый метод SaveData.
Попробуй это:
public override object SaveData(PropertyDataCollection properties)
{
this.LongString = _val;
return base.SaveData(properties);
}
Кроме того (прошло много времени с тех пор, как я посмотрел на это) для переопределения LoadData у меня есть что-то похожее на следующее:
public override void LoadData(object value)
{
// I'm sending value off to be used somewhere else.
base.Value = value;
}
Я не вызываю base.LoadData()