如何从动态创建的表单中获取用户输入

时间:2011-04-07 20:56:38

标签: asp.net oracle oracleclient

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

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

修改 我找到了答案here.

3 个答案:

答案 0 :(得分: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> 

答案 1 :(得分:0)

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

如果是webforms,您始终可以访问通过Request.Form集合提交的每个输入。

答案 2 :(得分:0)

以下是我最终根据包含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();
            }
        }