2009-07-28 35 views
1

我是一名自学asp.net,正在尝试一些小型项目来帮助理解更好的概念。我如何访问动态添加的html标签?

我正在使用html和asp.net(c#)创建一个简单的电子学习网站,其网页上有一个固定数量的多项选择调查问卷,我通过选择随机问题创建问卷,一个数据库表,然后创建一个字符串,将其插入div标记的innerhtml之前,将包含正确格式化问题的HTML代码(标签中的问题和单选按钮的答案)。 以上所有内容都在pageload()上完成; 问题是,我需要检查答案对答题纸(我已经存储在一个数组中的正确答案),但由于html代码在页面加载后添加,后面的代码不能看到标签或他们的ID。

问题: 我被告知我可以使用request.form [“Q#”]访问html标签吗? 可以some1请向我解释..如何可以做到?

和任何其他可能的方式来做同样的任务? (请阅读下面的注释plz)

注: 我知道我可以在html中创建问卷结构,然后将问题/答案添加到标签中。

或创建具有runat服务器属性的隐藏字段,然后将答案存储在它们中,并使用服务器端代码检查答案纸。

回答

2

问题:我被告知我可以使用request.form [“Q#”]访问html标签吗?可以some1请向我解释..如何做到这一点?

这几乎就是你写的。 Request.Form是一个关联数组,其页面上的每个表单域都有一条记录。该数组由输入字段的名称属性键入。对于服务器端控件,这通常默认为控件的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的请求上。净额:

客户端向服务器发送POST请求(附带表格值)。
服务器执行Asp.Net页面生命周期(init,load,control events,render)。
服务器将Asp.Net生成的HTML文件发送给客户端。正如你所看到的,如果Request.Form将有一个值,它会在PageInit开始之前设置(远少于PageLoad)。

+0

我认为,在传递到的Request.Form的关键必须是一样给予输入控件,而不是clientID的“名称”。 例如,如果检查到以下内容:* *则Request.Form [“Test”]将返回“Test 1“ – Greg 2009-07-28 13:48:59

+0

Aaron:如果我使用Request.Form [”Q1“],Q1是Question#1答案的单选按钮组的名称,那么该行将返回所选单选按钮的值?也不会要求。形式[“Q1”],在页面加载之前检查html标签id? 记得我正在加载页面上的html标签.. – 2009-07-28 13:58:19

+0

@Madi D.在第一次加载页面期间,表单集合将是空的(因为用户没有指定任何输入)。当页面回传时,表单集合将包含用户输入到页面上的输入控件中的所有内容。 – AaronSieb 2009-07-28 14:01:53

1

由于您的问题字符串是格式化的HTML,请尝试一个文字控件而不是标签。标签可以尝试“转义”您的html格式,并将您的html字符串包含在span标签中。而不是一个div,请尝试使用html面板。它将呈现相同的html,使事后可以更容易地插入文字和单选按钮。

+0

乔尔,thx为您的advice.will考虑,但我的主要问题是访问所选的答案,当用户点击提交。 – 2009-07-28 14:03:17

0

对不起,但你在做什么?您正在服务器端构建HTML代码,然后将其添加到div或标签或任何?我想这不是正确的做法。

首先创建一个合适的模型。构造类如

  • QuestionAnswerItem它是一个包含问题(文本等..),一些选择(例如字符串列表)和正确答案的类。
  • 保持QuestionAnswerItem列表问卷类对象

然后应使用中继器(或其他数据绑定控制),然后使用列表控件像CheckBoxListRadioButtonList。检查Repeater控件的MSDN文档,它是DataSource属性和DataBind()方法。我很确定它会帮助你。

访问所选答案应该可以通过遍历中继器项目并找到您的RadioButtonListCheckBoxList控件(可能使用FindControl(...))方法。一旦你有你的控制参考,你可以遍历它,并检查"Selected"属性。

使用这种方法你可以摆脱Request.Form[...]。到现在为止,我不得不使用它。

0

在ASP.NET中,有一些“网络服务器控件”通常取代传统的HTML控件。

例如,在HTML中的< input type =“radio”/>将作为服务器控件的一个< asp:RadioButton runat =“server”/>。还有一些Web服务器控件不以1对1的方式映射到传统的HTML控件,比如RadioButtonList。

这些使得它更容易在后面的代码中访问您的表单数据。

http://support.microsoft.com/kb/306459

+0

@Greg:我知道关于控制的所有信息,我用它们来创建问卷的第一个模板,它很简单,当我试图成为一个聪明人并且使它变得更复杂时,问题就出现了。 ,我不能在页面加载时添加标签,因为它们不会在页面创建时编译。 – 2009-07-28 14:14:06