We’re Engage

Your partner in turning your vision into technical excellence.

Start Your Journey With Us →

For over 25 years, we’ve combined our technical expertise with a partnership-focused approach𑁋delivering results that truly speak for themselves.

What truly sets us apart is how we engage with our partners. We take the time to understand what matters most to them, which is why every approach we take is uniquely tailored to their specific solution.

Discovery & Strategy

We kick off every project by working closely with you and your team in a discovery meeting to understand your vision and needs. Depending on the complexity and scale of our proposed solution, we’ll put together a team that includes project managers, designers, developers, or analysts, all tailored to your specific project. We’ll then present those custom solutions, discuss timelines, and clarify data requirements to make sure everyone is aligned from the start.

User Experience Design

Our design process is rooted in understanding your users and their behaviors. We gather user insights through research, interviews, and questionnaires which inform our design decisions. By focusing on user-centered and intentional designs, we create experiences that resonate with your audience.

Software Development

Our team works closely with you to create a solution that is both scalable and cost-effective. We keep the lines of communication open to ensure we're getting quick feedback from you at every stage. This allows us to continuously improve the solution and guarantee that we deliver the best possible results.

Continuous Optimization

As your partner, we view your solution as a long-term asset that we've designed to evolve alongside your growing needs. Projects typically unfold in multiple phases with each phase designed to optimize performance and ensure lasting success. Your dedicated team will equip you with actionable insights and best practices to keep you informed and supported with regular updates and performance improvements.

“Unlike large software companies where you’re just a number, Engage is a partner that listens, communicates, and adapts to our needs—not just for development, but for the years to come. That’s exactly what we were looking for, and we found it in Engage.”

Matt Wells, Vice President Mid-west Truckers Association Inc

Latest News

Razor Templates with DDR Menu in DNN 7

At Engage, we've really enjoyed using DDR menu for our skins.  It gives us a lot more control than we had before with the DNN menu (or SolPart before it).  One of the great features that we enjoyed was the ability to define a menu template using the Razor template language.  This gives us full access to C# code within the menu template, making it simple to do whatever we want the menu to do.  However, we ran into a snag when we started trying to update our sites to DNN 7.

DNN 7 updated the minimum requirements of the platform to require .NET 4, which allowed updating the System.WebPages dependency, which holds the Razor implementation.  There were some minor changes to the Razor syntax, so that what had worked before with a hack now worked like you'd expect (but the hack now caused an error).  That is, Razor is now much smarter about markup, and assumes that tags have reasonable elements and attributes.  Whereas previously I would create a string like " id='level-@level'" and then append it to an element like <ul@theId>, Razor will now let us put the attribute right on the element, and will hide it if it the value is null: <ul id="@(level == 0 ? Model.ControlID : null)">.  Likewise, Razor will collapse whitespace within an attribute, so class="@first @last @selected @bc" won't even render the class attribute if all of those variables are null.

There was another issue with DDR's implementation of Razor in DNN 7, though.  Even if you fixed those syntax errors, you'd be greeted with an error about Model not being defined.  The issue stems from DDR Menu's Razor implementation using System.WebPages directly.  When the System.WebPages dependency was upgraded to version 2, this broke DDR's integration.  So, instead, Erik VB update DDR Menu to use DNN's built-in Razor integration, which will shield DDR Menu from breaking changes like that in the future.  However, because of this change, templates which worked before need another declaration added to the top of the template file.  The canonical Razor DDR template starts with the following:

@using DotNetNuke.Web.DDRMenu;

To this, we'll need to add:

@using System.Dynamic;
@inherits DotNetNuke.Web.Razor.DotNetNukeWebPage<dynamic>

If your template is based on this canonical template, you'll also need to fix the syntax error mentioned above.  Originally, the template did the following to apply CSS classes to the individual page list items:

var cssClasses = new List<string>();
if (node.First) { cssClasses.Add("first"); }
if (node.Last) { cssClasses.Add("last"); }
if (node.Selected) { cssClasses.Add("selected"); }
var classString = new HtmlString((cssClasses.Count == 0) ? "" : (" class=\"" + String.Join(" ", cssClasses.ToArray()) + "\""));
<li@classString>
@** Put menu item link here **@
</li>

For the new Razor syntax, replace that with this:

var first = node.First ? "first" : null;
var last = node.Last ? "last" : null;
var selected = node.Selected ? "selected" : null;
var bc = node.Breadcrumb ? "bc" : null;
<li class="@first @last @selected @bc">
@** Still put menu item link here **@
</li>

Now, all of this perhaps seems like a lot of work, but you've got to remember, your template is running code on the website. If you're clever, you can do some crazy things in here (e.g. adding classes based on taxonomy, or anything else you can think of). The sky is the limit (just make sure you're considering performance before you go too crazy).

Turn Your Vision into Technical Excellence

Partner With Us →
© 1999-2025 Engage