在仪表板页面上,我正在动态加载多个控件;总是需要加载控件,因此没有if (!Page.IsPostBack)
代码。问题在于,在代码隐藏中,我们使用Request.Form.GetValues
并且特定的下拉字段的值始终为null(可能是因为控件正在被清除并在回发上重新加载)并且这在以后触发错误在页面中,从此下拉列表中选择一个值。我必须使用Request.Form.GetValues,因为该页面允许通过Javascript动态添加行(每行包含5个以上的HTML输入)。
如果我检查回发,那么控件的按钮事件根本不会触发,而是重新加载仪表板页面,并且根本没有加载任何控件(即页面为空白)。
如何解决此问题?我需要一直动态加载控件,但我还需要通过Request.Form.GetValues检索值。有什么建议吗?
修改
这是代码的样子,粗略地说:
(客户端HTML)
<table>
<tr>
<td align="center">
<select id="Class1" class="txtboxcomm" name="Class1" runat="server" />
<a href="javascript:classFinder('1')"> Look Up</a>
</td>
</tr>
</table>
<div id="action">
<asp:LinkButton ID="ibtnGetQuote" runat="server" OnClick="ibtnGetQuote_Click" CssClass="getQuote" AccessKey="G">Get Quote</asp:LinkButton>
</div>
(服务器端,在ibtnGetQuote_Click
中 - 这实际上是一个循环,因为用户可以追加多行;“i”被附加到单词“Class”以找到确切的行)
IList<string> classes = this.GetFormValues("Class1");
// This will return null all the time...
private IList<string> GetFormValues(string clientID)
{
String[] values;
values = Request.Form.GetValues(clientID);
if (values == null)
{
Control ctl = FindControl(clientID); // uses built-in FindControl method
values = Request.Form.GetValues(ctl.ClientID);
}
return values;
}
原始代码是硬编码“ctl00 $ xx $ xx”的东西,但控件可能加载也可能没加载,因此我们无法保证控件的名称。事实上,我甚至不确定这是否适用于所有场景,因为只有FIRST控件是服务器控件,其余的只是标准HTML控件,因此不会有“ClientID”。
答案 0 :(得分:0)
您似乎正在加载Load事件中的控件。这已经太晚了,因为此时已经处理了viewstate。您需要在Init事件中加载控件。
答案 1 :(得分:0)
可能是一个好主意是尽可能早地加载控件以将它们添加到控件树中。如果您可以在触发LoadViewState
方法之前执行此操作,则控件应像处理任何静态声明的控件一样处理视图状态。
答案 2 :(得分:0)
在CreateChildControls事件中控制创建和填充。在检查表单之前调用EnsureChildControls()。