URL routing in mvc - model-view-controller

I have this url working in my code:
http://localhost:12345/home/index/<parameter1>/<parameter2>/<parameter3>/<parameter4>
I want to change my url to NOT to include the home/index (<controller>/<action>).
My current Global.asax entry is like:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{parameter1}/{parameter2}/{parameter3}/{year}/{parameter4}", // URL with parameters
new { controller = "Home", action = "Index", parameter1= "", parameter2= "", parameter3= "", parameter4= ""} // Parameter defaults
);
Please let me know how can i change it
thanks in advance

Should be as simple as removing those parameters from the URL since you have them in the Defaults dictionary.
routes.MapRoute(
"Default", // Route name
"{parameter1}/{parameter2}/{parameter3}/{year}/{parameter4}", // URL with parameters
new { controller = "Home", action = "Index", parameter1= "", parameter2= "", parameter3= "", parameter4= ""} // Parameter defaults
);

Related

I want to set MVC route

I want to set routing, when the user will write a URL like www.abc.com/param1, it's auto-redirect or call to
www.abc.com/itemview/index/param1
www.abc.com/itemview/index/ is a fixed part.
I tried with the below route but it was not worked?
routes.MapRoute(name: "Default",
url: "ItemsViewNew/Index/{id}",
defaults: new { controller = "ItemsViewNew", action = "Index", id = UrlParameter.Optional }
);

MVC 3 custom routes - Redirects, Action, ActionLink have incorrect url

I have a certain folder structure I have to follow (/countrycode/language/) so I have my routes set up like below
routes.MapRoute(
"en-us",
"us/en/{action}/{id}",
new { Controller = "XXX", action = "Index", cc = "us", ll = "en", id = UrlParameter.Optional }
);
routes.MapRoute(
"fr-fr",
"fr/fr/{action}/{id}",
new { Controller = "XXX", action = "Index", cc = "fr", ll = "fr", id = UrlParameter.Optional }
);
routes.MapRoute(
"de-de",
"de/de/{action}/{id}",
new { Controller = "XXX", action = "Index", cc = "de", ll = "de", id = UrlParameter.Optional }
);
I've a single controller and multiple actions in that controller. When I try to redirect to an action, or link to an action within a view, the URL always starts with /us/en/ even if I was currently in /fr/fr/.
e.g. If the current route is /fr/fr/
#Html.ActionLink("fooText", "fooAction")
#Url.Action("barAction")
return RedirectToRoute("Index");
All end up as
/us/en/fooAction
/us/en/barAction
/us/en/
How can I make these methods link to the correct URL?
OK instead of:
#Html.ActionLink("fooText", "fooAction")
I need to use:
#Html.RouteLink("fooText", "fr-fr", new { controller = "XXX", action = "fooAction" })

ASP MVC 3 switching language with ActionLink

In an ASP MVC 3 project i want to enable language switching.
The routing is defined like this:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"DefaultWithLanguage", // Route name
"{language}/{controller}/{id}/{slug}", // URL with parameters
new { language = "en", controller = "Front", action = "Details", id = UrlParameter.Optional, slug = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
Trying to switch languages (in _Layout.cshtml) works like this:
<li>#Html.ActionLink("Spanish", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { language = "es" })</li>
Instead of getting a URL like the following (after having selected Spanish)
.../es/ControllerName/ActionName
i 'm getting this:
.../ControllerName/ActionName?Length=11
If i set the ActionLink to the following (notice the last null parameter):
<li>#Html.ActionLink("Spanish", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { language = "es" }, null)</li>
i get this:
.../ControllerName/ActionName?language=es
What am i missing?
Thanks in advance!
There are some issues with your routes registration DefaultWithLanguage route registration. It doesn't allow you to specify the {action}. This means that this route will only match a Details action (since you have specified it in the default values). Another issue is that you made the {id} parameter optional. But that's impossible. Only the last parameter of a route can be optional. In your case it is followed by a {slug} parameter.
So one possibility is the following:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"DefaultWithLanguage",
"{language}/{controller}/{action}/{id}",
new
{
language = "en",
controller = "Front",
action = "Details",
id = UrlParameter.Optional
}
);
}
and then:
#Html.ActionLink(
"Spanish",
ViewContext.RouteData.GetRequiredString("action"),
ViewContext.RouteData.GetRequiredString("controller"),
new { language = "es" },
null
)
If you wanted to add a {slug} parameter then your {id} can no longer be optional:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"DefaultWithLanguage",
"{language}/{controller}/{action}/{id}/{slug}",
new
{
language = "en",
controller = "Front",
action = "Details",
slug = UrlParameter.Optional
}
);
}
and then:
#Html.ActionLink(
"Spanish",
ViewContext.RouteData.GetRequiredString("action"),
ViewContext.RouteData.GetRequiredString("controller"),
new {
language = "es",
id = ViewContext.RouteData.GetRequiredString("id")
},
null
)
This is a follow up to Darin's answer.
I want to have routes like this:
.../en/ControllerName/Id
.../en/ControllerName/Id/Slug
.../en/ControllerName
This last route causes the problem (see the answer of Darin). The "hack" to keep getting this routes is to define also another route (the second named DefaultWithLanguageWithoutId) :
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"DefaultWithLanguage", // Route name
"{language}/{controller}/{id}/{slug}", // URL with parameters
new { language = "en", controller = "Front", action = "Details", id = UrlParameter.Optional, slug = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"DefaultWithLanguageWithoutId", // Route name
"{language}/{controller}", // URL with parameters
new { language = "en", controller = "Front", action = "Details"} // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
This is causing the code to be adjusted in the master page to the following
<li>#Html.ActionLink("Deutsch", ViewContext.RouteData.Values["action"].ToString()
, ViewContext.RouteData.Values["controller"].ToString(), new { language = "de"
, id = ViewContext.RouteData.Values["id"]!=null ? ViewContext.RouteData.Values["id"].ToString():null }, null)</li>
<li>#Html.ActionLink("English", ViewContext.RouteData.Values["action"].ToString()
, ViewContext.RouteData.Values["controller"].ToString(), new { language = "en"
, id = ViewContext.RouteData.Values["id"] != null ? ViewContext.RouteData.Values["id"].ToString() : null }, null)</li>
Works perfect!
The only "drawback" is the fact that there is some code involved (i would have liked to avoid) in the view, but i think it is worth since it is very simple!

Simple Html.Actionlink question (MVC3)

The Route:
routes.MapRoute(
"Items", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Item", action = "Index", id = UrlParameter.Optional} // Parameter defaults
);
The htmlhelper:
#Html.ActionLink("Chairs", "List", "Item", new {id="Chairs"}, null)
The link it generates:
http://localhost:57899/Item/List?id=Chairs
What I want it to show:
http://localhost:57899/Item/List/Chairs
How to do that?
Instead of using ActionLink what happens if you try the following?
#Html.RouteLink("Items", new { id = "Chairs" })
You call Html.RouteLink (not Action Link) and map an additional route under your generic like this:
routes.MapRoute(
"ChairsRoute", // Route name
"Item/List/{id}", // URL with parameters
new {controller = "Item", action = "Index", id = UrlParameter.Optional} // Parameter defaults
);
when you call RouteLink, you'll simply pass that "ChairsRoute" name

Configure asp.net mvc hocalhost/Home/Products to hocalhost/Products

How to configure asp.net mvc routing to get
hocalhost/Products and hocalhost/Search
instead of
hocalhost/Home/Products and hocalhost/Home/Search
i.e. to remove Controller name from the route?
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Products", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default",
"{action}/{id}",
new { controller = "Home", action = "Products", id = UrlParameter.Optional }
);
Thus:
http://example.com/ => controller=Home, action=Products
http://example.com/Products => contoller=Home, action=Products
http://example.com/Search => contoller=Home, action=Search

Resources