我正在构建一个允许用户创建和进行测试的ASP.NET网站。测试可以包含各种类型的问题(多项选择,真/假,论文等)。由于测试的动态性,我正在创建带有中继器的“Take Test”页面。
我现在的问题是:如何获得用户的答案?使用固定数量/类型的问题,这很简单,但我不确定如何从动态创建ID的项目中获取答案,或者如何将可变数量的答案传回我的数据库。
修改 我找到了答案here.
答案 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();
}
}