Converting any object to a RouteValueDictionary so I don’t have to list properties in a MVC view

Home » ASP.NET MVC » Converting any object to a RouteValueDictionary so I don’t have to list properties in a MVC view
ASP.NET MVC Logo

Problem

The problem I had is that I had a search page, which went to a search results page that could be paginated. The paginator needs to know the search criteria used, so it can create a link on the page which calls for page x with the correct search criteria set.

I originally had code that looked like this in my view:

The search criteria class has a list of properties that can be searched for. The problem is, I didn’t want to have a list of all the properties in any views that use it, I wanted to be able to say:

However this code does not work, as you can’t pass a complex object into Url.Action. Serialising this into a query string doesn’t work. I looked into how I could do this via fixing the serialisation problem, but chose a different approach in the end which is documented below.

One Solution

Url.Action can take an anonymous object, or it can take a RouteValueDictionary. So the first step was to put a ToRouteValueDictionary in my model. This wasn’t going to work for me, because my domain classes don’t access System.Web (or any data access routines for that matter, I use IOC).

So I decided on an extension method that used reflection to create a Dictionary, this only adds results if the value isn’t null, which means we don’t have lots of null querystring parameters in practice:

The view then is responsible for turning the Dictionary into a RouteValueDictionary

About Phil

I have been working as a software developer since 1983. This blog could have been called "From Fortran 77, C and Cobol to C# in 20 (not so) easy years", but it doesn't sound quite right somehow. Besides I'm talking about what's happened since 2003, not before!

Leave a Reply

Your email address will not be published.


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">




Top Posts & Pages

Categories

Recent Posts

Recent Comments

Archives

Blogroll

  • Mike Cohn's Blog
  • Scott Hanselman's Blog
- mike@mountaingoatsoftware.com

Certified Scrum Trainer Lance Dacy and I discuss some trends we’re noticing and ponder the future of [...]

- mike@mountaingoatsoftware.com

Teams often struggle to persuade their product owners to prioritize refactoring. This simple four-st [...]

- mike@mountaingoatsoftware.com

One of the benefits of being on a team is the friendships you can make with your teammates. Many of [...]

- mike@mountaingoatsoftware.com

I wrote 24 blog posts during 2019. In case you missed some of them, here are the most popular. [...]

- mike@mountaingoatsoftware.com

It’s coming on Christmas. That time of year when I drop hints to my family about gifts I’d like. [...]

- Scott Hanselman

I've written about WSL2 and it's glorious wonders many times. As its release (presumably) [...]

- Scott Hanselman

Four years ago I wrote how to BUILD (literally compile) Visual Studio Code for a Raspberry Pi ARM ma [...]

- Scott Hanselman

It's time. It's the feature complete release of the Windows Terminal. Stop reading, and go [...]

- Scott Hanselman

At Microsoft Ignite 2019, we were happy to announce that the "Try .NET global tool" added [...]

- Scott Hanselman

I've blogged before about ASP.NET Architect David Fowler's hidden gems in ASP.NET. His Git [...]

Meta