由于代码比较多,但问题我已经确定就是这个了。 我先重新描述一下我的问题。
我写了一个自定义控件,里边使用了repeater控件,在itemdatabound的时候动态生成控件,由于web form框架在执行postback的时候,只要你的控件id不变,那么会自动利用viewstate还有什么getPostData(?)之类的方法给相应的控件赋值,开始的时候工作正常。 所谓正常指的是,我在一个页面上加载这个控件,给这个控件内部的textbox, drplist之类控件赋值,然后做postback,控件的值都会保存下来。
接下来我对动态生成repeateItem内的控件的代码做了点修改,就发现postback后页面值没有了。调查到最后,发现这个现象,下边是示例代码:
TextBox txt = new TextBox();
txt.id = "txtTest";
placeHolder1.Controls.Add(txt);
这种情况下工作正常。
修改一下:
TextBox txt = new TextBox();
txt.id = "txtTest";
placeHolder1.Controls.Add(txt);
string strTest = txt.ClientID;
立刻的,postback后,页面值就都丢了。
不知道各位有无遇到过这种问题,改怎样解决。
最后补充下,我的开发环境是vs2005, sharepoint2007.
没道理啊。一个form提交跟服务器没关系。页面上有什么表单元素,服务器端就会收到什么。直接通过Request.Form["txtTest"] 访问是肯定在的。
只有一个要注意的地方:页面postback后要重新创建动态生成的控件。asp.net 会自动把Request.Form里对应的值填入动态生成的控件中。
你的问题最有可能是控件重新创建的时间太晚,以至于asp.net不能自动将值装入控件中。这种情况下通过控件的属性就取不到值了。
这跟viewstate没什么关系,new出来的控件应该是没有viewstate可以回传的。
请尝试将绑定数据的代码repeater.Databind()和new TextBox()写在if(!IspostBack){}里面。
或在repeater模版中使用静态的Textbox控件
肯定会丢的
你new出来的不仅仅是会丢的问题
你new出来的那个其实就是一段html 只能显示(只是个普通的客户端控件)
连通过findcontrol在服务器端找到这个控件都不可能
这个只是微软为了提供视图效果做出来像服务器端的代码的一个例子
但是这个并不是真正的实现了服务器端的功能
你如果想取道这个控件的值
还只能用request来取