动态加载控件和回发

时间:2011-03-18 19:01:48

标签: asp.net

在仪表板页面上,我正在动态加载多个控件;总是需要加载控件,因此没有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')">&nbsp;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”。

3 个答案:

答案 0 :(得分:0)

您似乎正在加载Load事件中的控件。这已经太晚了,因为此时已经处理了viewstate。您需要在Init事件中加载控件。

答案 1 :(得分:0)

可能是一个好主意是尽可能早地加载控件以将它们添加到控件树中。如果您可以在触发LoadViewState方法之前执行此操作,则控件应像处理任何静态声明的控件一样处理视图状态。

答案 2 :(得分:0)

在CreateChildControls事件中控制创建和填充。在检查表单之前调用EnsureChildControls()。