【发布时间】:2019-06-12 21:16:50
【问题描述】:
让我们假设一个类 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*"
}
我完全理解为什么会发生这种情况,但我不知道如何存档。
编辑: 我认为它实际上与 ASP 和控制状态没什么可看的。我认为可以在序列化部分解决。我想我需要做的就是以某种方式让两个控件都使用一个共享序列化器,并让这个控件明白,如果它已经序列化了具有给定 Id 的对象,则它需要返回相同的对象。
如果这需要类似的接口,那是可以接受的。
interface IFoo {
int Id {get; set;}
}
【问题讨论】:
-
为了更好地理解,为什么对象相同很重要?之后可以将这两个对象合并为一个对象吗?
-
因为这需要在每个页面上进行自定义实现,因此阻碍了我们尝试通过使用自定义控件来存档的好处。控件需要知道完整的对象,因为它的行为基于与它所控制的属性不同的其他属性。
标签: c# asp.net serialization control-state