views:

55

answers:

3

Hi guys,

I am struggling with generating outbound urls in asp.net mvc 2. Here is the scenario.

Controller: MoveController Action: Index() View: Index.aspx

Now what I would like is to have multiple urls mapping to same controller (MoveController) and action (Index) with different parameter (locationId) value

e.g.

  • url -> RouteData
  • /Production/ -> Move/Index/1
  • /Installation/ -> Move/Index/2
  • /Move/3/ -> Move/Index/3

My mapping look like this:

 public static void RegisterRoutesTo(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*favicon}", new
        {
            favicon = @"(.*/)?favicon.ico(/.*)?"
        });

        routes.MapRoute(
           null,                                              // Route name
           "Production/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

        routes.MapRoute(
           null,                                              // Route name
           "Installation/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

        routes.MapRoute(
           null,                                              // Route name
           "Move/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new
            {
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional
            }  // Parameter defaults
        );
    }

Now to generate the outbound urls in my master page menu, I am doing something lik ethis

<%= Html.ActionLink("Production", "Index", "Move", new{locationId = 1}, null)%>
<%= Html.ActionLink("Installation", "Index", "Move", new{locationId = 2}, null)%>

But the above generates

  • /Production/1
  • /Production/2

which is correct, but how can i tell it to generate

  • /Production/ when the locationId =1
  • /Installation/ when locationId = 2

Any Idea?

Awaiting,

A: 

The provided ActionLink helper extension won't do that. You'd need to write a new, custom ActionLink method that will render conditionally as you require.

Dave Swersky
Hi Dave, what do you think about eglasius response and my response?
nabeelfarid
@nabeel: If eglasius answer works it looks good to me. I had the impression that the ActionLink needed to be dynamic, it looks like that's not the case.
Dave Swersky
+1  A: 

long shot, but definitely worth a shot as your routes above weren't expressing what you want:

routes.MapRoute(
   null,                                              // Route name
   "Production/",                           // URL with parameters
   new
   {
       controller = "Move",
       action = "Index",
       locationId = 1
   }

);

routes.MapRoute(
   null,                                              // Route name
   "Installation/",                           // URL with parameters
   new
   {
       controller = "Move",
       action = "Index",
       locationId = 2
   }

);

eglasius
brilliant, this works.
nabeelfarid
What I didn;t know is that one doesn't necessarily have to define the {parameters} in the url. I always thought that the parameters need to be defined in the url.
nabeelfarid
+1  A: 

Hi Eglasius,

You are correct the Production and Installation routes are exactly the same. I just didn't know how to differentiate them, as they both take the same parameter {locationId} but with different values. As you can see I have provided the default value to be different, but thats just a default value, so therefore I tried putting constraint on them

routes.MapRoute(
               null,                                              // Route name
               "Production/{locationId}",                           // URL with parameters
               new
               {
                   controller = "Move",
                   action = "Index",
                   locationId = 1
               }
               ,  // Parameter defaults
               new
               {
                   locationId = @"1"
               }// constraint for Production url
           );

            routes.MapRoute(
               null,                                              // Route name
               "Installation/{locationId}",                           // URL with parameters
               new
               {
                   controller = "Move",
                   action = "Index",
                   locationId = 2
               }
               ,  // Parameter defaults
               new
               {
                   locationId = @"2"
               }// constraint for Production url
           );

This works but then I realisez that when defining the Html.ActionLink giving value of null for parameters

<%= Html.ActionLink("Installation", "Index", "Move", null, null)%>

it produces the Production/ url, which it should as its the first one in the order.

What I didn;t know is that one don;t necessarliy have to define the {parameters} in the url. I always thought that the parameters need to be defined in the url.

Thanks for all the help guys

nabeelfarid
@nabeelfarid nice catch on the null, didn't realize that it would cause that.
eglasius