Enad Llahsram
Enad Llahsram

Reputation: 25

MVC Routing Parameter Not Being Passed

I am trying to do some MVC routing, following online tutorials, but for some reason the routing is not working.

I am trying to do http://www.website.com/news/news-title

The route I am trying to do is below.

routes.MapRoute(
    "News",
    "{controller}/{url}",
    new { controller = "News", action = "Index", url = "" }
);

Within my NewsController I have the following ActionResult.

public ActionResult Index(String url)
{
    return View();
}

However, when stepping thorough the code, url is not being populated.

Thanks

== Update ==

Thank you all for your replies.

I have no amended the Route to below

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.LowercaseUrls = true;

        routes.Add(new SubdomainRoute());

        routes.MapRoute(
            "News",
            "News/{action}/{slug}",
            new { controller = "News", action = "Index" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

This URL works: /news/index/?slug=test-news-title

But this URL does not: /news/index/test-news-title

=== Further Edit ===

It appears my subdomain route is messing with it. If i remove the subdomain route it works fine.

Thanks.

Upvotes: 1

Views: 1565

Answers (3)

Hussain Patel
Hussain Patel

Reputation: 470

You are missing the action part in the MapRoute

routes.MapRoute(
    "News",
    "{controller}/{action}/{url}",
    new { controller = "News", action = "Index", url = "" }
);

Hope this help

Upvotes: 0

Massimo Franciosa
Massimo Franciosa

Reputation: 554

You have set for the parameter url the empty string. you should use instead UrlParameter.Optional (or removing it at all if is mandatory):

routes.MapRoute(
    "News",
    "{controller}/{url}",
    new { controller = "News", action = "Index", url = UrlParameter.Optional }
);

Upvotes: 0

NightOwl888
NightOwl888

Reputation: 56869

Most likely, your route is too broad. But it depends on how the rest of your routes are configured. You would need to post your entire route configuration (including area routes and attribute routing) in order to reasonably get an answer what is wrong with your route.

However, you can be more specific with this route because you know that it needs to start with /News.

routes.MapRoute(
    "News",
    "News/{url}",
    new { controller = "News", action = "Index" }
);

Also, it probably doesn't make sense to make the URL parameter optional by providing a default value. If you remove url = "", the url parameter is required in the URL. If configured as above, if you just pass /News, it won't match this route. However, as you have it this URL will match.

Finally, make sure this route is placed in the right order. It should be placed before your default route (if you still have it).

Upvotes: 1

Related Questions