One thing that kind of annoys me is the situation where you just want a url, but you don’t want one of the prepackaged links using:
Html.RouteLink
Or
Html.ActionLink
Mostly because you want to be able to create your own html and you only want the created url. Well turns out there’s a method for this: The RouteUrl method on the UrlHelper class. Down side is that it’s not static and takes a few lines to use, so not cool UI design side. Well here’s a method that uses that method and gives you a method to exact a method of victory. I think that sentence had promise, but fell short of complete failure.
Anyways, here it is… The “Just give me the stupid url” method, CreateUrl for short.
public static String CreateUrl
(
RequestContext context,
RouteCollection routeCollection,
String routeName,
String controller,
String action,
RouteValueDictionary routeValues
)
{
//Create the helper
UrlHelper neededHelper = new UrlHelper(context, routeCollection);
//get the route to check what it is holding at far
//as defaults go
var neededRoute = (Route)routeCollection[routeName];
//this might be overkill honestly. Basically in case the
//Route contains the "controller" key only then add it to the
//values for the route. Otherwise just ignore. It's possible
//someone might pass in a controller/action but the route
//doesn't take them. At which point you'll
//be showing the "Aw maaaaan" face.
if (!String.IsNullOrEmpty(controller) && neededRoute.Defaults.ContainsKey("controller"))
{
routeValues.Add("controller", controller);
}
if (!String.IsNullOrEmpty(action) && neededRoute.Defaults.ContainsKey("action"))
{
routeValues.Add("action", action);
}
//And then the call to create the url string.
return neededHelper.RouteUrl(routeName, routeValues);
}
And in use View side:
<a href="
<%
CreateUrl
(
Html.ViewContext.RequestContext,
Html.RouteCollection,
GeneralConstants.RouteDefault,
"SomeController",
"SomeAction",
new RouteValueDictionary { { "id", 1 } }
)
%>"
>
Something is linked
</a>
Now mind you I did use a link there so it seems like a silly example. However, you can do many other things now that you just have the url itself.