New Community Website

Ordinarily, you'd be at the right spot, but we've recently launched a brand new community website... For the community, by the community.

Yay... Take Me to the Community!

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

ISearchable: Easily make your DotNetNuke® module searchable

The ISearchable interface is used to allow the users of your module to search for content using the search mechanism provided by the DotNetNuke framework.

What ISearchable Will Do For You

Most uses are familiar with the search provided by websites such as

If you type in "create a DotNetNuke module" in Google you will see a list of websites that describe how to make DotNetNuke modules. If you type in "buy a DotNetNuke module" you will see sites that sell DotNetNuke modules. Google is able to understand (to the best of it's ability) what you are ultimately trying to find by searching through the entire contents of all the pages it has stored in it's database.

The search provided by the DotNetNuke framework doesn't work like that. It works more like an index in the back of a book. The only items in the index are items that the author (in this case the module developer) has decided to put there. The search merely allows DotNetNuke portal users to quickly find items placed in this index.

The DotNetNuke Search is Very Useful

At first glance you might prefer the Google approach and not see the usefulness of the search provided by the DotNetNuke framework. However, like a carefully constructed index in a book, the DotNetNuke search allows the module developer to deliver helpful relevant results to search queries by only placing items in that index that a user would want to search on. In this case what you leave out is as important as what you put in.

For the Survey module it was decided that only the questions not the answers would be placed in the search index. This omitted such potentially repetitive and unhelpful words such as yes and no from cluttering up the search results.

Implementing Search for the Survey Module

To implement search for the Survey module we performed three steps:

  • Indicate that the controller class will implement the ISearchable interface
  • Insert the code for the ISearchable interface
  • Update the module configuration

Implement ISearchable in the Controller Class

When you look at the module definition for the Survey module, you can see that the controller class defined is DotNetNuke.Modules.Survey.SurveyController.

We opened up this class in the Visual Studio code editor and added this line at the top of the class and hit the Enter key.

Implements Entities.Modules.ISearchable

Hitting the Enter key after we insert the line causes Visual Studio to insert a stub for the method.

(the green wavy line under End Function is there because currently the method does not return a value. This will be fixed in the next step.)

Next, we add the following code to the method and save the page.

 ' Get the Surveys for this Module instance
Dim colSurveys As List(Of SurveyInfo) = GetSurveys(ModInfo.ModuleID)
Dim SearchItemCollection As New SearchItemInfoCollection
Dim SurveyInfo As SurveyInfo

For Each SurveyInfo In colSurveys
Dim SearchItem As SearchItemInfo
SearchItem = New SearchItemInfo _
(ModInfo.ModuleTitle & " - " & SurveyInfo.Question, _
SurveyInfo.Question, _
SurveyInfo.CreatedByUser, _
ModInfo.ModuleID, _
SurveyInfo.SurveyId, _

Return SearchItemCollection

We return to the module definition (for the Survey module) and click the Update link.

Searchable will now be checked under Supported Features.

The content will now be searchable.

What Did We Just Do?

To implement the search we performed three steps:

  • Created and filled a SearchItemInfo object
  • Added this object to the SearchItemInfoCollection collection
  • Returned the SearchItemInfoCollection as the output for the method

If you look in the object browser at the definition for the SearchItemInfo object you can see that it has a number of overloads.

The constructor we used has this signature:

Public Sub New(
ByVal Title As
ByVal Description As String,
ByVal Author As Integer,
ByVal PubDate As
ByVal ModuleID As Integer,
ByVal SearchKey As
ByVal Content As
Member of:

The important thing to remember is that the SearchKey parameter must be a unique value. In this case we passed the contents of the SurveyId field (from the Surveys table) to the SearchKey parameter.

The Content is the content that the portal users will be searching on. We passed the contents of the Question field to the Content parameter. As you can see in the table schema below, the Question field has a direct one-to-one relationship with the SurveyID field.

This line adds the SearchItemInfo object to the SearchItemInfoCollection collection:


This line returns the SearchItemInfoCollection collection as the output of the method:

Return SearchItemCollection

DotNetNuke is a Framework To Make Your Job Easier

You could easily create your own search function. However, it would certainly require more code. In addition the Search functionality provided by the DotNetNuke framework searches across all modules (that implement the interface) at the same time.

This demonstrates yet another reason why you should consider leveraging the DotNetNuke framework for your next project to save time and money.


Comment Form

Only registered users may post comments.


Aderson Oliveira (22)
Alec Whittington (11)
Alessandra Davies (3)
Alex Shirley (10)
Andrew Hoefling (3)
Andrew Nurse (30)
Andy Tryba (1)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (37)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Bogdan Litescu (1)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (213)
Chris Paterra (55)
Clint Patterson (108)
Cuong Dang (21)
Daniel Bartholomew (2)
Daniel Mettler (181)
Daniel Valadas (48)
Dave Buckner (2)
David Poindexter (12)
David Rodriguez (3)
Dennis Shiao (1)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (80)
Francisco Perez Andres (17)
Geoff Barlow (12)
George Alatrash (12)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (274)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Kelly Ford (4)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matt Rutledge (2)
Matthias Schlomann (16)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Miguel Gatmaytan (3)
Mike Horton (19)
Mitchel Sellers (40)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Oliver Hine (1)
Patricio F. Salinas (1)
Patrick Ryan (1)
Peter Donker (54)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Sacha Trauwaen (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott Schlesier (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Steven Fisher (1)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (3)
Tycho de Waard (4)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (40)
Will Strohl (180)
William Severance (5)
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out