【问题标题】:how can i access dynamically added html tags?如何访问动态添加的 html 标签?
【发布时间】:2009-07-28 13:30:11
【问题描述】:

我正在自学 asp.net,并且正在尝试一些小项目来帮助更好地理解这些概念。

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

问题: 我被告知我可以使用 request.form["Q#"] 访问 html 标签? 有人可以向我解释一下..怎么做?

以及任何其他可能的方法来完成相同的任务? (请阅读下面的注释)

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

或使用 runat 服务器属性创建隐藏字段,然后将答案存储到其中,并使用服务器端代码检查答案表。

【问题讨论】:

    标签: asp.net html


    【解决方案1】:

    问题:有人告诉我可以使用 request.form["Q#"] 访问 html 标签?有人可以向我解释一下..怎么做?

    这和你写的差不多。 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 页面生命周期(初始化、加载、控制事件、渲染)。
    服务器获取由 Asp.Net 生成的 HTML 并将其发送给客户端。

    当客户端想要将更多信息发送回服务器时,它通过提交由 Asp.Net 生成的特殊表单来实现。这导致每个输入控件的值都附加到发送到 Asp.Net 的请求中:

    客户端向服务器发送一个 POST 请求(附带表单值)。
    服务器执行 Asp.Net 页面生命周期(初始化、加载、控制事件、渲染)。
    服务器获取由 Asp.Net 生成的 HTML 并将其发送给客户端。

    如您所见,如果 Request.Form 将有一个值,它会在 PageInit 开始之前设置(更不用说 PageLoad)。

    【讨论】:

    • 我认为传递给 Request.Form 的键必须与输入控件的“名称”相同,而不是 clientID。例如,如果检查了以下 那么 Request.Form["Test"] 将返回“测试 1”
    • Aaron:所以如果我使用 Request.Form["Q1"] ,其中 Q1 是问题 #1 答案的单选按钮组的名称,该行将返回所选单选按钮的值?也不会 request.form["Q1"] ,在页面加载之前检查html标签ID吗?记得我在pageload上加载html标签..
    • @Madi D. 在第一页加载期间,表单集合将为空(因为用户没有指定任何输入)。当页面回发时,表单集合将包含用户在页面上的输入控件中输入的所有内容。
    【解决方案2】:

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

    【讨论】:

    • Joel ,感谢您的建议。将考虑到这一点,但我的主要问题是当用户点击提交时访问选择的答案。
    【解决方案3】:

    在 ASP.NET 中,有“Web 服务器控件”通常会替代传统的 HTML 控件。

    例如,HTML 中的 将是一个 作为服务器控件。还有一些 Web 服务器控件不以一对一的方式映射到传统的 HTML 控件,例如 RadioButtonList。

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

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

    【讨论】:

    • @Greg:我对控件了如指掌,我用它们创建了问卷的第一个模板,它简单易行,当我试图成为一个聪明人和复杂的时候,问题就来了它甚至更多。我不能在页面加载时添加 标签,因为它们不会在页面创建时被编译。
    【解决方案4】:

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

    首先创建一个合适的模型。像

    这样构造类
    • QuestionAnswerItem 是一个包含问题(文本等)、一些选择(例如字符串列表)和正确答案的类。
    • Questionaire 类,其中包含 QuestionAnswerItem 对象列表

    然后您应该使用Repeater(或其他DataBound 控件),然后使用CheckBoxListRadioButtonList 等列表控件。检查 MSDN 文档中的 Repeater 控件及其 DataSource 属性和 DataBind() 方法。我很确定它会对你有所帮助。

    然后应该可以通过遍历中继器项目并找到您的RadioButtonListCheckBoxList 控件(可能使用 FindControl(...))方法来访问所选答案。获得控件引用后,您可以对其进行迭代并检查 "Selected" 属性。

    使用这种方法,您可以摆脱Request.Form[...]。直到现在我都很少使用它。

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      相关资源
      最近更新 更多