使用 Cookie 在 DotNetNuke 之间传递 ASCX 控件数据
本文探讨了一种在 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 控件。
不幸的是,NavigateURL
与 Server.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 查询等。