65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Cookie 在 DotNetNuke 之间传递 ASCX 控件数据

2009年2月23日

CPOL

3分钟阅读

viewsIcon

19965

本文探讨了一种在 DotNetNuke ASCX 控件中发送数据的方法。

引言

在 DotNetNuke (DNN) 中,您在一个模块中使用 Web 用户控件,而不是 Web 窗体中的 .aspx 页面。这意味着您的模块不使用表单来将数据从一个控件传递到另一个控件。在本文中,我将探讨如何使用 Cookie 将数据从一个控件发送到另一个控件,以存储用户编辑的表单中的数据,以便可以将选择用于进一步处理。

使用代码

一旦您创建并设计了一个用户控件来显示您希望处理的表单字段,您需要做一些事情来将选定的选项传递到另一个用户控件进行处理。由于用户控件中没有 <form></form> 块,因此您无法执行

Server.Transfer("FormProcessing.aspx")

您必须执行类似的操作

Response.Redirect(NavigateURL(TabId, "CompanySearchResult", _
                  "Mid=" & CStr(ModuleId)), False)

使用 NavigateURL 是 DNN 中用于查找和加载在您的自定义模块中注册的控件的方法。在尝试调用 NavigateURL 之前,您必须在 DNN 中注册新的 .ascx 控件。

不幸的是,NavigateURLServer.Transfer 不同。它只是将引用的控件加载到浏览器中。您没有诸如 Response.Request("control") 之类的方法来读取用户的选择。为了获取输入的数据,您可以选择使用 Cookie。可能有其他方法可以做到这一点,但在本文中,我将探讨使用 Cookie 来持久化表单中的用户选择。

此代码遍历已加载的表单,并查找所有已输入某些数据的表单字段,并将这些值分配给以表单字段控件名称命名的 Cookie。

Dim i As Integer
Dim Item As String
Dim ItemValue As String
Dim X As Integer

i = 0
For X = 0 To Request.Form.Count() - 1
    Item = Request.Form.Keys(X) 'grabs form field Name
    If InStr(Item, "ns_") > 0 Then 'test form field name
        If Request.Form.Item(X) <> "" Then 'acts on form fields data

            ItemValue = Request.Form.Item(X) 'assigns value to a shorter var
            Session(Item) = ItemValue.ToString 'converts for value to string 
            i = i + 1

        End If
    End If
Next

注意,Session(Item) = ItemValue.ToString 是动态生成 Cookie 并分配值的部分。在上面的代码示例中,还要注意在处理之前检查前缀“ns_”。包含此项是为了确保仅检查所需的表单字段控件。字段名称的前缀是可选的,但在使用 MultiView 或在 Visual Studio 中设置 VaidationGroup 时,它会派上用场。

就目前而言,此代码将为具有相应前缀的表单字段元素生成名称/值对。不幸的是,当 DNN 渲染控件时,它会在您的表单字段控件上附加前缀信息。检查 Cookie 名称/值对将显示如下内容

$ctr371$ViewSearchSOS$ns_NameSearch=Some User Entered Data

您可能需要删除动态生成的无用数据以访问实际的字段控件名称,在本例中为“ns_NameSearch”。

另一个需要考虑的问题是您正在使用 Cookie 来持久化表单选择数据。如果用户重新使用该表单(例如,执行另一个搜索),您的读取现有 Cookie 数据的代码还将看到在新搜索中未使用的其他字段上的任何先前条目。例如,如果您搜索公司名称和城市,则会为该数据生成 Cookie。如果您对新的公司名称以及州或邮政编码(但不是新的城市)执行另一次搜索,则读取的 Cookie 仍将包含旧的城市数据。

此修改后的代码会剥离 DNN 无用数据并删除所有现有 Cookie

Dim Item As String
Dim ItemValue As String
Dim X As Integer
Dim SplitItem() As String

Session.Contents.Clear() 'Clears all cookies for session.
i = 0

For X = 0 To Request.Form.Count() - 1
    Item = Request.Form.Keys(X)          
    If InStr(Item, "ns_") > 0 Then
       If Request.Form.Item(X) <> "" Then
          ItemValue = Request.Form.Item(X)
          'creates an array using $ as the deliminator
          SplitItem = Split(Item, "$")
          'finds the last item in the array
          Dim j As Integer = SplitItem.Length - 1
          'assigns the last item name to value
          Session(SplitItem(j)) = ItemValue.ToString
          i = i + 1
          End If
      End If
Next

在引用的 .ascx 控件中,从生成的 Cookie 中检索名称/值对,以在控件上的标签中显示选择。

Sub Label1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) _
                     Handles Label1.PreRender
    Dim item As String
    Dim itemlist As New StringBuilder
    Dim ItemLength As Integer
    Dim ItemLengthTrim As Integer
    Dim ItemName As String

    itemlist.Append("You selected: <br>")

    For Each item In Session.Contents
        If InStr(item, "ns_") > 0 Then
            If Len(Session(item)) > 0 Then
                ItemLength = Len(item)
                ItemLengthTrim = ItemLength - 3
                ItemName = Right(item, ItemLengthTrim)
                itemlist.Append(ItemName)
                itemlist.Append("=" & Session(item) & "<br>")
            End If
        End If
    Next

    Me.Label1.Text = itemlist.ToString

End Sub

请注意,额外的字符串处理用于剥离“ns_”前缀以用于显示目的。

您可以在其他地方使用 Cookie 名称/值对来对数据库执行 SQL 查询等。

© . All rights reserved.