Допустим, класс Foo похож на
[Serializable]
class Foo{
int Id { get; set; }
String Property1 { get ;set; }
String Property2 { get ;set; }
}
У меня есть пользовательский элемент управления ASP, например
class MyControl : CompositeControl {
object MyObject { get; set; }
string PropertyName { get; set; }
}
У меня есть страница ASPX, как
<MyControl id="mycontrol1" MyObject="<%# MyFoo %>" PropertyName="Property1"></MyControl>
<MyControl id="mycontrol2" MyObject="<%# MyFoo %>" PropertyName="Property2"></MyControl>
//code behind
Foo MyFoo { get; set; }
protected override void OnInit(EventArgs e){
if (Page.IsPostBack) return;
//retrieve from Db:
MyFoo = new Foo {
Id = 123,
Property1 = "Hello",
Property2 = "World"
};
}
Элемент управления используется для изменения свойства, указанного в PropertyName, давайте предположим, что элемент управления просто добавляет * к свойству, это работает нормально. Я использую управляющее состояние для хранения сущности между обратными передачами. И там все идет не так.
Я создаю один объект Foo.
Я связываю этот один объект с обоими элементами управления
Оба элемента управления сериализуют сущность в их состоянии управления
Оба элемента управления добавляют * к свойству. (внешний интерфейс)
При обратной передаче оба элемента управления десериализуют объект из состояния управления.
Я получаю два объекта:
//In mycontrol1.MyFoo
{
Id = 123,
Property1 = "Hello*",
Property2 = "World"
}
//In mycontrol2.MyFoo
{
Id = 123,
Property1 = "Hello",
Property2 = "World*"
}
Где я намеревался использовать оба экземпляра для ссылки на один и тот же объект.
//mycontrol1.MyFoo and
//mycontrol2.MyFoo both referring to
{
Id = 123,
Property1 = "Hello*",
Property2 = "World*"
}
Я прекрасно понимаю, почему это происходит, но я понятия не имею, как архивировать это.
Edit:
Я думаю, что на самом деле не так много, чтобы увидеть с ASP и контроль состояния. Я думаю, что это может быть решено в части сериализации. Я думаю, все, что мне нужно, это каким-то образом заставить оба элемента управления использовать общий сериализатор и дать понять, что, если он уже сериализовал объект с заданным идентификатором, он должен вернуть один и тот же объект.
Если для этого требуется подобный интерфейс, это приемлемо.
interface IFoo {
int Id {get; set;}
}