【问题标题】:asp.net looping through checkboxes getting values to send to another pageasp.net 循环通过复选框获取值以发送到另一个页面
【发布时间】:2011-08-17 02:20:55
【问题描述】:

我正在尝试遍历我在我的 aspx 页面上创建的一堆复选框。我想获取所有值,并将它们解析为字符串以作为发布变量发送到另一个页面。这是我到目前为止所拥有的:

aspx 页面:

<div class="ReportsCustomBox"><asp:CheckBox ID="CheckBox0" runat="server" /> Name</div>
<div class="ReportsCustomBox"><asp:CheckBox ID="CheckBox1" runat="server" /> Training Year</div>
<div class="ReportsCustomBox"><asp:CheckBox ID="CheckBox2" runat="server" /> Continuity Clinic</div>
etc...

aspx.vb 文件:

Protected Sub Submit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Submit.Click
    Dim targetURL As String
    targetURL = "report.aspx?"

    ' This is the part i can't figure out.
    ' For Each checkbox on page
        'if checkbox is checked
        'targetURL &= checkboxid & "=true&"

End Sub

我的目标是构建另一个页面,然后使用 Querystring 变量检查这些值,并从中构建一个列表视图。 (一个报告页面,基本上可以让用户选择他们想在报告中看到的列的复选框)

非常感谢任何帮助或指导! 谢谢!

【问题讨论】:

    标签: asp.net vb.net checkbox


    【解决方案1】:

    您可以循环浏览页面控件并找出答案(我的 vb.net 生锈了,但希望这能给您带来想法):

    For Each ctrl As Control In Page.Controls
        If TypeOf ctrl Is CheckBox AndAlso CType(ctrl, CheckBox).Checked Then
            targetURL &= CType(ctrl, CheckBox).Id & "=true&" 
        End If
    Next
    

    【讨论】:

      【解决方案2】:

      不是直接回答您的问题,但除非您有特定理由不回答,否则您应该直接将表单发布到其他页面。不要费心去弄乱后面的代码,这将是脆弱且容易出错的。

      使用Button.PostbackUrl 属性更改您发布到的页面

      <asp:Button id="Submit" Text="Submit!" PostbackUrl="~/other-page.aspx"/>
      

      并且在另一个页面的代码隐藏中使用Request.Form 来访问发布的值。

      根据您的具体情况,您甚至可以强输入上一页以更轻松地访问属性和值。 http://dotnettipoftheday.org/tips/strongly-typed-access-to-previous-page.aspx

      【讨论】:

      • 对不起,我知道这不是一个直接的答案,但是当你像我这样的新手时,你有时甚至不知道该问什么。但这很完美,正是我真正想要的。 :) 谢谢!
      • 让我知道是否有办法编辑此问题以使其对社区更有价值。我知道我将此标记为解决方案,但这不是我确切问题的确切答案。 (我应该回去编辑问题吗?)感谢 Jeff 阅读我的菜鸟台词。 :)
      • 无需为此道歉。这就是stackoverflow的用途!我很高兴能帮到你。使这种方式更加困难的一个部分是另一页的Request.Form 集合中的值看起来有点古怪。您应该运行调试器来检查 Request.Form.AllKeys 以准确了解您需要如何引用它们。
      【解决方案3】:

      您可以循环浏览页面的控件集合,但您不会在 Table 或 GridView 等容器控件内部找到 CheckBox。

      这将找到所有复选框:

      Public Module ExtensionMethods
      
          <Runtime.CompilerServices.Extension()> _
          Public Sub GetControlsRecursively(ByVal parentControl As System.Web.UI.Control, ByVal type As Type, ByRef controlCollection As List(Of Control))
              If parentControl.GetType = type Then
                  controlCollection.Add(parentControl)
              End If
      
              For Each c As System.Web.UI.Control In parentControl.Controls
                  c.GetControlsRecursively(type, controlCollection)
              Next
          End Sub
      
      End Module
      

      你可以这样称呼它:

      Dim allCheckboxes As New List(Of Control)
      Me.Page.GetControlsRecursively(GetType(CheckBox), allCheckboxes)
      

      并以这种方式循环它们:

      Dim txt As New System.Text.StringBuilder()
      For Each chk As CheckBox In allCheckboxes
          If chk.Checked Then txt.Append(chk.ID).Append("=true&")
      Next
      If txt.Length <> 0 Then txt.Length -= 1
      Dim url = txt.ToString
      

      【讨论】:

        【解决方案4】:

        另一个选项,根据你所说的你想要做的,是完全跳过整个 Checkbox 控件,而使用普通的复选框。我建议这样做,因为它更容易处理。

        例如,您可以在 html 中添加以下内容(主要是您为所有这些设置相同的 name 属性值,并将该值设置为有意义的值):

        <div class="ReportsCustomBox"><input type="checkbox" name="reportColumns" value="Name" /> Name</div>
        <div class="ReportsCustomBox"><input type="checkbox" name="reportColumns" value="TrainingYear" /> Training Year</div>
        <div class="ReportsCustomBox"><input type="checkbox" name="reportColumns" value="ContinuityClinic" /> Continuity Clinic</div>
        

        然后,它将作为一个变量进入 Form 集合,其中包含已检查值的逗号分隔列表(例如,如果您选中了这两个框,Request.Form("reportColumns") 将返回 "Name,TrainingYear"。然后您可以将此值直接在查询字符串中传递到下一页,您可以在其中将值拆分为一个数组并处理每个值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-29
          • 1970-01-01
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 2012-05-14
          • 1970-01-01
          • 2020-12-01
          相关资源
          最近更新 更多