我正在自学asp.net,正在尝试一些小项目来帮助更好地理解这些概念。
我正在创建一个简单的电子学习网站,使用html和asp.net(c#),在其中一个页面上有一个固定数量的多选择问卷, 我通过从数据库表中选择随机问题创建问卷,然后创建一个字符串,其中包含正确格式化的问题的html代码(标签和答案中的问题作为单选按钮),然后将其插入到div的innerhtml中标签。 所有上述内容都是在pageload()上完成的; 问题是我需要根据答案表检查答案(我已经在数组中存储了正确的答案),但由于html代码在页面加载后添加,因此无法看到标签或其ID。
问题: 我被告知我可以使用request.form [“Q#”]访问html标签? 可以请一些人向我解释......它可以做到吗?
以及执行相同任务的任何其他可能方法? (请阅读下面的注释)
注意: 我知道我可以用html创建问卷结构,然后将问题/答案添加到标签中。
或使用runat服务器属性创建隐藏字段,然后将答案存储到其中,并使用服务器端代码检查答案表。
答案 0 :(得分:2)
问题:我被告知我可以使用request.form [“Q#”]访问html标签?可以请一些人向我解释......它可以做到吗?
这几乎就是你所写的。 Request.Form是一个关联数组,页面上的每个表单字段都有一条记录。数组由输入字段的name属性键控。对于服务器端控件,这通常默认为控件的ClientId ...但是如果你自己生成HTML,那么任何事情都会发生。
if(Request.Form["Q0"] == answers[0]) {
//Answer is correct
}
然而,从事物的声音来看,有更好的方法来完成你所追求的目标。
一种选择是使用Repeater控件,并将其数据源设置为包含有关问题信息的数组。然后你可以这样做:
foreach(item as RepeaterItem in repeater) {
if(item.FindControl("radioButtonListId").SelectedValue == answer) {
//Answer correct
}
}
编辑:
以下是对如何填充Request.Form集合的快速说明。
页面的典型请求如下:
客户端向页面发送请求到服务器
服务器执行Asp.Net页面生命周期(init,load,control events,render)
服务器获取Asp.Net生成的HTML并将其发送到客户端。
当客户希望将更多信息发送回服务器时,它会通过提交由Asp.Net生成的特殊表单来实现。这导致每个输入控件的值附加到发送到Asp.Net的请求:
客户端向服务器发送POST请求(附加表单值) 服务器执行Asp.Net页面生命周期(init,load,control events,render) 服务器获取Asp.Net生成的HTML并将其发送到客户端。
正如您所看到的,如果Request.Form将具有值,则在PageInit开始之前设置它(更不用说PageLoad)。
答案 1 :(得分:1)
由于您的问题字符串是格式化的html,请尝试文字控件而不是标签。标签可以尝试“转义”您的html格式,并将您的html字符串括在span标记中。而不是div,尝试使用HTML面板。它将呈现相同的html,使事后更容易插入文字和单选按钮。
答案 2 :(得分:0)
抱歉,你在做什么?您正在服务器端构建HTML代码,然后将其添加到div或标签或其他什么?我想这不是正确的做法。
首先创建一个合适的模型。构建类似
的类然后,您应该使用Repeater(或其他DataBound控件),然后使用CheckBoxList
和RadioButtonList
等列表控件。检查MSDN文档中的Repeater控件及其DataSource
属性和DataBind()
方法。我很确定它会对你有帮助。
然后,可以通过迭代转发器项并找到RadioButtonList
或CheckBoxList
控件(可能使用FindControl(...))方法来访问所选答案。获得控件引用后,可以对其进行迭代并检查"Selected"
属性。
使用这种方法可以摆脱Request.Form[...]
。到目前为止,我很少使用它。
答案 3 :(得分:0)
在ASP.NET中,有“Web服务器控件”通常取代传统的HTML控件。
例如,< input type =“radio”/>在HTML中将是< asp:RadioButton runat =“server”/>作为服务器控件。还有一些Web服务器控件不能以1对1的方式映射到传统的HTML控件,例如RadioButtonList。
这使得在后面的代码中访问表单数据变得更加容易。