我正在构建一个允许用户创建和参加测试的 ASP.NET 网站。测试可以包含各种类型的问题(多项选择、真/假、论文等)。由于测试的动态特性,我正在创建带有中继器的“Take Test”页面。
我现在的问题是:我怎样才能得到用户的答案?对于固定数量/类型的问题,这很简单,但我不确定如何从具有动态创建的 ID 的项目中获取答案,或者如何将可变数量的答案传递回我的数据库。
编辑: 我在这里找到了答案。
我正在构建一个允许用户创建和参加测试的 ASP.NET 网站。测试可以包含各种类型的问题(多项选择、真/假、论文等)。由于测试的动态特性,我正在创建带有中继器的“Take Test”页面。
我现在的问题是:我怎样才能得到用户的答案?对于固定数量/类型的问题,这很简单,但我不确定如何从具有动态创建的 ID 的项目中获取答案,或者如何将可变数量的答案传递回我的数据库。
编辑: 我在这里找到了答案。
您可以使用 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>
如果您使用的是 Asp.Net MVC,您可以参考这篇文章。模型绑定到集合
如果它的网络表单,您始终可以访问通过 Request.Form 集合提交的每个输入。
这是我最终针对每种问题类型所做的,基于包括这个的链接。
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();
}
}