The very famous ActionLink
:
<%: Html.ActionLink("Back to List", "Index")%>
Now, this link is in my Details view. The Index view is a search page. The URL of that looks like this:
http://localhost:50152/2011-2012/Instelling/Details/76?gemeente=Dendermonde&postcode=92**&gebruikerscode=VVKSO114421&dossiernr=114421%20&organisatie=CLB
As you can see, quite the amount of parameters. Obviously I want to keep all these parameters when I return to the Index page, so I need to add them in the ActionLink
.
Now, I'm tired of doing that manually, it's ok for 1, but not for 6. This should go a lot easier.
Question: How do I return All parameters of the current URL into the ActionLink
as optional RouteValues
.
I've been looking to Request.QueryString
. It has to be something with that. I was thinking of writing some static method in Global.asax
doing the job but no luck yet. Maybe there is an easy way to do this which I don't know about?
Edit: This is what I came up with (which works)
In global.asax:
public static RouteValueDictionary optionalParamters(NameValueCollection c) {
RouteValueDictionary r = new RouteValueDictionary();
foreach (string s in c.AllKeys) {
r.Add(s, c[s]);
}
return r;
}
Details.aspx:
<%: Html.ActionLink("Back to List", "Index", MVC2_NASTEST.MvcApplication.optionalParamters(Request.QueryString))%>
Where do I best put this code? not in Global.asax
I guess...
Edit 2:
using System;
using System.Web.Mvc;
namespace MVC2_NASTEST.Helpers {
public static class ActionLinkwParamsExtensions {
public static MvcHtmlString CustomLink(this HtmlHelper helper, string linktext) {
//here u can use helper to get View context and then routvalue dictionary
var routevals = helper.ViewContext.RouteData.Values;
//here u can do whatever u want with route values
return null;
}
}
}
<%@ Import Namespace="MVC2_NASTEST.Helpers" %>
...
<%: Html.ActionLinkwParams("Index") %>
i have tested this and its working. optional parameters can be acquired from query string HTH
Create a ToRouteValueDictionary() extension method for Request.QueryString to use Html.ActionLink as-is and simplify your view markup:
Your extension method might look like this:
To use the extension method in your view see this question and answer: How do I use an extension method in an ASP.NET MVC View?
This is simpler and involves much less code than the accepted answer.
Perhaps the best way is to write your own html helper where you traverse through the previous route value dictionary and add route values to the current action link, except the action parameter off course.
edit: You can write the html helper like this:
This is how I finally fixed it, and i'm rather proud because it's working very well and very DRY.
The call in the View:
but with the overloads it can be anything which a normal ActionLink takes.
The Helper:
The helper takes all parameters from the url which are not in the route. For example: this url:
So it will take the postalCode and the Org and place it in the new ActionLink. With the overload, additional parameters can be added, and parameters from the existing url can be removed.
In the View using overloads:
in the URL I have the paramters postalCode with some value. my code takes All of them in the URL, by setting it to string.Empty, I remove this parameter from the list.
Comments or ideas welcome on optimizing it.
Here is an extension method for ViewContext that creates a RouteValueDictionary based on the request route values and querystring.
You can pass the created RouteValueDictionary to Html.ActionLink or Url.Action
If the Page parameter does not exist in the request URL, it will be added in the generated URL. If it does exist, its value will be changed to 5.
This article has a more detailed explanation of my solution.