【问题标题】:Dynamically loading controls and postbacks动态加载控件和回发
【发布时间】: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')">&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”。

【问题讨论】:

  • 您的措辞给人的印象是许多控件中只有一个存在此问题。这是正确的,还是所有动态控件都遇到这种行为?
  • 就空值而言,它只在客户端追加行的控件上,因为第一行是实际的服务器控件(即具有 ASP.NET ctl00_$Stuff_$Stuff 类型命名),并且 Request.Form.GetValues 为该控件返回 null。

标签: asp.net


【解决方案1】:

您似乎正在加载 Load 事件中的控件。这为时已晚,因为此时视图状态已被处理。您需要在 Init 事件中加载控件。

【讨论】:

  • 控件在 OnInit 中被动态加载,但是它们在 Page_Load 中被初始化为一些默认值。
  • 你能发布一个小样本吗,可能只有一个动态控件(比如下拉菜单)。
【解决方案2】:

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

【讨论】:

  • 那会是什么时候?我已经尝试过 OnInit 和 InitComplete,但该值仍然从 Request.Form.GetValues 返回为 null。
【解决方案3】:

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

【讨论】:

  • 试过了;控件初始化自定义方法没有被触发,并且没有设置所需的默认值(下拉选项等)。在 Page_Load 中调用 Init;应该在别的地方吗?
  • uhh.. 是的,它应该在 CreateChildControls 中。
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多