这有效,但这是正确的方法吗?
我有一个自定义服务器控件,上面有一个[输入]框。我希望它有点模仿ASP.NET TextBox,但不完全。渲染文本框时,我有一个javascript,允许用户选择随后放在该输入框中的值。
我在控件上有一个公共文本属性。在get / set中我获取/设置控件的视图状态 - 该部分很简单,但是当通过javascript填充控件时,实际上并未调用Text get,使用JavaScript设置此公开属性的正确方法是什么(或者即使用户只是输入框中的内容)?
编辑: 在OnInit中,我确保通过达到表单值来维护状态。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (HttpContext.Current.Request.Form["MyInputBoxValue"] != "")
{
ViewState["MyInputBoxValue"]
= HttpContext.Current.Request.Form["MyInputBoxValue"];
}
}
然后在HtmlTextWrite中实际返回值,我这样做:
protected override void RenderContents(HtmlTextWriter output)
{
// There is an input control here and i set its value property
// like this using the Text internal defined.
output.Write("<input value=" + Text + ">.....
}
感谢
答案 0 :(得分:1)
我发现使用IStateManager效果最好。
例如:
partial class MyControl : System.Web.UI.UserControl, IStateManager
{
[Serializable()]
protected struct MyControlState
{
public bool someValue;
public string name;
}
protected MyControlState state;
public bool someValue {
get { return state.someValue; }
set { state.someValue = value; }
}
public bool IsTrackingViewState {
get { return true; }
}
protected override void LoadViewState(object state)
{
if ((state != null) && state is MyControlState) {
this.state = state;
}
}
protected override object SaveViewState()
{
return state;
}
protected override void TrackViewState()
{
base.TrackViewState();
}
}
getDefaultState()只会将一些合理的默认值加载到新的状态结构中。状态在页面的视图状态中被跟踪,ASP将负责为您带来/输出。
(以上代码从VB移植而未经过检查,希望我没有发现任何错误,但无论如何都应该得到重点)
答案 1 :(得分:0)
如果您需要在回发时维护状态,则必须提供自己的方法 记录用户在客户端使用您的控件所做的事情 然后在服务器上更新服务器控件 更改,或在页面刷新时重做客户端上的更改。
答案 2 :(得分:0)
嗯,我想知道我们是否可以使用现有的ASP.NET持久性...尝试继承最基本的后备状态持久控制(我在想asp:hidden)。然后只需覆盖渲染并添加所需的所有爵士乐。
让我知道它是否有效,那么我将不必测试:)。