【问题标题】:How to get user input from dynamically created form如何从动态创建的表单中获取用户输入
【发布时间】:2011-04-07 20:56:37
【问题描述】:

我正在构建一个允许用户创建和参加测试的 ASP.NET 网站。测试可以包含各种类型的问题(多项选择、真/假、论文等)。由于测试的动态特性,我正在创建带有中继器的“Take Test”页面。

我现在的问题是:我怎样才能得到用户的答案?对于固定数量/类型的问题,这很简单,但我不确定如何从具有动态创建的 ID 的项目中获取答案,或者如何将可变数量的答案传递回我的数据库。

编辑: 我找到了我的答案here.

【问题讨论】:

    标签: asp.net oracle oracleclient


    【解决方案1】:

    你可以使用 Request.Form

    但这是另一种使用 FindControl 和 Repeater 的方法:

        For Each item As RepeaterItem In Me.RptItems.Items
    
            Dim value = CType(item.FindControl("TxtName"), TextBox).Text
    
        Next
    

    您可以对每个 RepeaterItem 使用 FindControl 方法,并通过 ID 在其中找到所需的控件。

    ASPX 文件:

    <asp:Repeater ID="RptItems" runat="server">
        <HeaderTemplate>
            <table>
                <tr>
                    <td>
                        Name
                    </td>
                </tr>
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td>
                    <asp:TextBox ID="TxtName" runat="server" Text='<%# Eval("Name")%>'></asp:TextBox>
                </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater> 
    

    【讨论】:

    • 我基本上是这样做的,但略有不同。我的文本框需要一个隐藏字段,并且我使用的是 C#。感谢您的帮助!
    【解决方案2】:

    如果您使用的是 Asp.Net MVC,您可以参考这篇文章。 Model Bind To Collection

    如果它的网络表单,您始终可以访问通过 Request.Form 集合提交的每个输入。

    【讨论】:

      【解决方案3】:

      这是我根据包括this one 在内的链接对每种问题类型最终所做的。

      foreach (RepeaterItem item in myRptr.Items)
              {
                  if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                  {
                      OracleCommand cmd = new OracleCommand();
                      cmd.Connection = conn;
                      cmd.CommandText = "myPackage.myProcedure";
                      cmd.CommandType = System.Data.CommandType.StoredProcedure;
                      cmd.Parameters.Add("user_id", OracleType.VarChar).Value = Session["UserId"].ToString();
                      cmd.Parameters.Add("question_id", OracleType.Number).Value = ((HiddenField)item.FindControl("myHidden")).Value;
                      cmd.Parameters.Add("answer", OracleType.VarChar).Value = ((TextBox)item.FindControl("myTxt")).Text;
                      cmd.ExecuteNonQuery();
                  }
              }
      

      【讨论】:

      • 这正是我所说的。您可以在网格中使用您需要的任何控件(HiddenField、TextBox、DropDown、...),并通过循环遍历中继器项来获取它的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2018-11-24
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多