【发布时间】:2011-03-18 19:01:47
【问题描述】:
在仪表板页面上,我动态加载了几个控件;控件总是需要加载,所以没有if (!Page.IsPostBack) 代码。问题在于,在代码隐藏中,我们使用Request.Form.GetValues,并且特定下拉字段的值始终为空(可能是因为在回发时正在清除和重新加载控件),这会在稍后触发错误期望从此下拉列表中获得值的页面。我必须使用 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”。
【问题讨论】:
-
您的措辞给人的印象是许多控件中只有一个存在此问题。这是正确的,还是所有动态控件都遇到这种行为?
-
就空值而言,它只在客户端追加行的控件上,因为第一行是实际的服务器控件(即具有 ASP.NET ctl00_$Stuff_$Stuff 类型命名),并且 Request.Form.GetValues 为该控件返回 null。
标签: asp.net