Learn More





DNN Community Blog

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.

Module Navigation Options for your DotNetNuke® Module

In this article we will explore the various DotNetNuke module navigation methods available. In addition, we will hopefully provide perspective that will allow the module developer to leverage the DotNetNuke Framework as their solution rather than trying to provide their solution in one module.

There are various options for navigation in your DotNetNuke module:

  • Module Actions (IActionable) and NavigateURL
  • Dynamically Loaded Controls
  • MultiView Control
  • Multiple View Control Definitions

Module Actions (IActionable) and NavigateURL

Module Actions (IActionable) and NavigateURL are the primary navigation options. Module Actions (implemented using the IActionable interface) creates a link on the module's drop-down menu and on the module's menu bar.

The disadvantage is that the links only appear in those two places. If you want to place a link in the middle of your module you will want to use NavigateURL.

The problem many developers find with both of these options is that when you navigate to another control, all the other modules on the page disappear. This can actually be a helpful in many cases as it focuses the user's attention on the item in question (the portal navigation is still available however).

If this is not desired, other options are available.

Dynamically Loaded Controls

A developer can use a placeholder control on their module:

<asp:PlaceHolder id="phDynamicPlaceHolder" runat="server"></asp:PlaceHolder>

and dynamically load a control into the placeholder.

This provides a seamless and easily controlled user experience. When the user navigates from one control to the other, the other modules on the page stay visible.

The disadvantage of this method is that it requires additional code files and in many cases duplicated code as each control is usually unable to share methods. In addition, each control is unaware of the status of other controls in the module and unable to read or modify their values directly. 

MultiView Control

The MultiView control allows the module developer the advantages of dynamically loaded controls while only using one code file. In addition, all controls in the module are able to easily interact with each other.

Using the MultiView control is simple. In Visual Studio (or Visual Web Developer Express), drop a MultiView control on the page and place one or more view controls in the MultiView Control.

After you do this, you can drop other controls inside the View controls and configure them as you normally would.

With the MultiView control, controls placed inside it are coded the same way they normally would be. You do not have to indicate the View control that a control is in when you reference it.

All controls are able to read values and change values of any control in the module, even controls that are not visible.

In the example code (see link at the end of this article), View Number 1 asks for an age:

When you switch to View Number 2 it is able to read and reset the value even though the control is now invisible.

You can easily create navigation that can hide and display Views

by simply setting the active View in the MultiView control.

MultiView.ActiveViewIndex = 2

In a View, you can place a button that can make other controls disappear, even controls that do not reside in the MultiView control

The code download also provides an example of posting back to the same View. All the controls behave as they normally would. The active view is only changed when you expressly indicate it.

The disadvantage of this method is that only one View in a MultiView control can be visible at one time, although it is possible to use multiple MultiView controls.

Multiple View Control Definitions

The best way to leverage the DotNetNuke frameworks inherit abilities is to create multiple view controls that display at the same time using multiple module definitions.

The Blog module provides an example of using multiple module definitions to separate the functionality of a module. Blog entries are displayed in one view control, settings in another, and calendar navigation in yet another.

This is achieved by creating multiple definitions in the modules configuration. Each definition has it's own default View control that will appear at the same time.

Not only does this allow the user to access features without navigating through links and menus, but it also allows the portal administrator to arrange the options and even move some options to another page.

DotNetNuke is a Framework

The word Frame in DotNetNuke Framework is appropriate because like a picture frame surrounds a picture, the DotNetNuke Framework surrounds your solution. A module should not be thought of as the solution. Rather, a module should be thought of as part of the solution the way an arm or a leg is part of a complete body.

The advantage of using DotNetNuke is that you are able to leverage it's abilities to deliver an overall user experience. Why recreate extensive navigation when the framework already provides it?

Using the human body as an analogy, instead of trying to design the upper half of a human body, design just a better hand and place that hand on an arm that the framework already provides.

Likewise, instead of trying to control the entire user experience in one module, try to implement only a specific functionality in a single module. For additional functionality, create another module. This design will allow you to create solutions as large as you can imagine.

Download the example module here:

View the source code: View.ascx / View.ascx.vb


Comment Form

Only registered users may post comments.


2sic Daniel Mettler (124)
Aderson Oliveira (15)
Alec Whittington (11)
Alex Shirley (10)
Andrew Nurse (30)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (22)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (203)
Chris Paterra (55)
Clinton Patterson (28)
Cuong Dang (21)
Daniel Bartholomew (2)
Dave Buckner (2)
David Poindexter (3)
David Rodriguez (2)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (74)
Geoff Barlow (6)
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 (270)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matthias Schlomann (15)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Mike Horton (19)
Mitchel Sellers (28)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Peter Donker (52)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott S (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)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (2)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (37)
Will Strohl (163)
William Severance (5)
Try Evoq
For Free
Start Free Trial
a Demo
See Evoq Live
Need More Information?