MVC Routing not working for particular value - asp.net-mvc

I have this route configuration
routes.MapRoute(
name: "catProducts",
url: "Description/{action}/{id}",
defaults: new { controller = "Home", action = "ProductDetail" }
);
routes.MapRoute(
name: "Products2",
url: "Category/{action}/{cat}/{subcat}",
defaults: new { controller = "Home", action = "Products", subcat = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "",
defaults: new { controller = "Account", action = "Login"}
);
routes.MapRoute(
name: "Default1",
url: "{controller}/{action}"
);
When I am trying
http://localhost/B2BWebSite/Description/ProductDetail/3
it's somtime redirect right but sometime goes to login page

There is no specific route defined for B2BWebSite. Hence when you go to http://localhost/B2BWebSite/Description/ProductDetail/3 it checks for default route and your Default route is Account/Login as below. Which is why it goes to login page.
routes.MapRoute(
name: "Default",
url: "",
defaults: new { controller = "Account", action = "Login"}
);
Regarding, you question about sometimes it works and sometimes doesn't; probably has something to do with login information in the session. If user is logged in, it might not go to login page.

You may need to specify id in the first route.
routes.MapRoute(
name: "catProducts",
url: "Description/{action}/{id}",
defaults: new { controller = "Home", action = "ProductDetail", id= UrlParameter.Optional }
);

Related

RouteConfigproblem in mvc5

In my RegisterRoutes method i like to set companyName with value like
" http://localhost:22146/abccompany/subject/Index ", I have done with this following code.
routes.MapRoute(
name: "Default",
url: "{company}/{controller}/{action}/{id}",
defaults: new { company = "abccompany", controller = "Account", action = "Login", id = UrlParameter.Optional }
);
Its working, But when my subject controller hit without "/index" then does not hit that action.
like " http://localhost:22146/abccompany/subject" then not working.
Please show me a solution.
Because you set the default action to be Login when you registered the route. Change it to index action and it will work.
routes.MapRoute(
name: "Default",
url: "{company}/{controller}/{action}/{id}",
defaults: new { company = "abccompany", controller = "Account",
action = "Index", id = UrlParameter.Optional }
);

MVC Routing Issue when trying www.example.com/id

Let say I have a website www.example.com
the default routing looks like
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);
Ok that works fine but let's say I want my site when I go to www.example.com/id to go to www.example.com/login/index/id
How would I configure/add routing for this, without breaking my other pages where I am actually trying to go to www.example.com/controller?
EDIT: Unfortunately id is a string so I do not have any concrete constraints that I can think of that would work. Think of maybe instead of the id I should have said companyname or sitename so the URL would look like www.example.com/companyname .
The only solution that I have come up with so far is adding a maproute for each one of my controllers like this
routes.MapRoute(
name: "Home",
url: "Home/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Settings",
url: "Settings/{action}/{id}",
defaults: new { controller = "Settings", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "companyname",
url: "{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);
This will work but I have many controllers and if I add one in the future and forget to adjust the routes it will fail. Also, this is unlikely but if a companyname happens to the be same as one of my controller names it would also fail.
In controller you may redirect to another Controller/action:
public ActionResult yourAction()
{
return RedirectToAction("nameAction","nameController");
}
Did you tried adding this mapping first:
routes.MapRoute( name: "Custom", url: "{id}", defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional } );
That should work but keep in mind that routes are evaluated secuentially, so you will have to organize mappings in order to reach out all pages in your site.
For example, routes like www.example.com/Product could be redirected to /Login by mistake.
EDIT: You can add constraints, so if id is an int value, you can try with the following:
routes.MapRoute("Custom", "{id}",
new { controller = "Login", action = "Index" },
new { id = #"\d+" }
EDIT 2: Having ids as string values, the only solution I see is to manually add each controller as you said, or to add something like this:
routes.MapRoute(
name: "Default",
url: "app/{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);
This way you don't need to update each route in the future.
Please try below routing
routes.MapRoute(name: "companylogin", url: "companylogin/{id}", defaults: new
{
controller = "Login",
action = "Index",
id = UrlParameter.Optional
});
routes.MapRoute(name: "default", url: "{controller}/{action}/{id}", defaults: new
{
controller = "Login",
action = "Index",
id = UrlParameter.Optional
});
Remove other controller specific routing. Now you can navigate to login using
url : - www.example.com/companylogin/{id} and all other url redirect default route.

ReturnUrl is not formed properly while accessing one of my controller?

I have one controller Jobs when I'm trying to access this controller without logging to my portal, return url is not formed properly and it looks like
http://test-employer.cloudapp.net/accounts?ReturnUrl=%2F
and for accessing any other controller its formed properly
http://test-employer.cloudapp.net/accounts?ReturnUrl=%2Fusers
Below is my routing config
routes.MapRoute(
name: "JobFeed",
url: "jobs/{q}/jobfeed.xml",
defaults: new { controller = "Jobs", action = "Feed", q = UrlParameter.Optional }
);
routes.MapRoute(
name: "JobPostingFeed",
url: "postings/{q}/jobfeed.xml",
defaults: new { controller = "Postings", action = "Feed", q = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Asp.net mvc routing without a controller or action name

I am trying to redirect all urls that don't match an existing controller to a certain controller.
For example, the url mywebsite.com/newyork should be processed as mywebsite.com/Cities/Info/newyork
I am using the following code in my RegisterRoutes but it doesn't seem to work as I get a 404 reponse:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Cities",
url: "{cityname}",
defaults: new { controller = "Cities", action = "Info", cityname= "" }
);
You should put your cities route first and drop the empty default parameter:
routes.MapRoute(
name: "Cities",
url: "{cityname}",
defaults: new { controller = "Cities", action = "Info" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
The routes are processed in order so you should have most specific first to least specific ( your default route).
As your website.com/newyork matched the default route, it wasn't continuing to your city route.

ASP.NET MVC route

I have only default route enabled:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Which will resove paths like: hostname/Home/Index, hostname/Home/Foo, hostname/Home/Bar/23 just fine.
But I must also enable route like this: hostname/{id} which should point
to:
Controller: Home
Action: Index
{id}: Index action parameter "id"
Is such a route even possible?
If id is a number you could add a route above the other one and define a regex constraint:
routes.MapRoute(
name: "IdOnlyRoute",
url: "{id}",
defaults: new { controller = "Home", action = "Index" },
constraints: new { id = "^[0-9]+$" }
);
Not Tested :
Create your route like this
routes.MapRoute(
name: "custom",
url: "{controller}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
under your default route
Since I'm short on time, I have configured route for every action. Luckly there are not many of them. :)
routes.MapRoute(
name: "IndexWithParam",
url: "{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "IndexWithOutParam",
url: "",
defaults: new { controller = "Home", action = "Index" }
);
routes.MapRoute(
name: "Login",
url: "Home/Login",
defaults: new { controller = "Home", action = "Login" }
);
So last route was repeated for ever other action. Not sure if it can be done better, but it works.
Have you tried to play around with AttributeRouting package?
Then your code will look like this
[GET("/{id}", IsAbsoluteUrl = true)]
public ActionResult Index(string id) { /* ... */ }

Resources