假设我有以下课程:
[Serializable]
public class Data{
public string Prop1 { get; set;}
public int Prop2 { get; set; }
}
我正在构建一个自定义服务器控件,它将其值存储到一个input type=hidden
字段中,该字段包含此类的 json 序列化版本(由客户端的某种 javascript 使用)。此值可能会被 javascript 代码修改,并且在客户端和服务器端都应该始终准确。
首次启动时,预期的 Html 输出为:
<input type="hidden" value="{ Prop1:'zzz', Prop2: 42 }" />
为了方便开发人员使用,我想在我的服务器控件中发布一个这种类型的属性,可以直接编写,包括嵌套属性:
public class MyControl : WebControl {
public Data Data {
get; // correct implementation to be found
}
}
// somewhere else
void foo(){
var myControl = (MyControl)FindControl("my");
myControl.Data.Prop1 = "some value";
myControl.Data.Prop2 = 1234;
}
我应该如何编写自定义控件的 Data 属性?
到目前为止,我已经编写了这段代码:
public class MyControl : Control
{
protected HiddenField inputInternalValue;
protected override void CreateChildControls()
{
this.inputInternalValue = new HiddenField();
this.Controls.Add(this.inputInternalValue);
}
private void inputInternalValue_ValueChanged(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(inputInternalValue.Value))
{
// use of Newtonsoft's Json convert
m_Value = JsonConvert.DeserializeObject<MyControlValue>(inputInternalValue.Value);
}
}
protected override void OnPreRender(System.EventArgs e)
{
base.OnPreRender(e);
inputInternalValue.Value = JsonConvert.SerializeObject(Value);
}
[Serializable]
public class MyControlValue
{
public string Prop1 {get; set;}
public string Prop2 {get; set;}
public static MyControlValue Default()
{
return new MyControlValue
{
Prop1 = "some default value",
Prop2 = "999"
};
}
}
private MyControlValue m_Value;
public MyControlValue Value
{
get
{
EnsureChildControls();
if (m_Value == null)
{
if (!string.IsNullOrEmpty(inputInternalValue.Value))
{
// use of Newtonsoft's Json convert
m_Value = JsonConvert.DeserializeObject<MyControlValue>(
inputInternalValue.Value
);
}
else
{
m_Value = MyControlValue.Default();
}
}
return m_Value;
}
}
}
但是,此代码仅在第一次回发时按预期工作。如果我在页面上添加一个按钮,我尝试在其中读取值,则将保留第一个回发值,第二个则不保留。
我认为我的问题与页面生命周期有关。我不能确定回读已经完成。