Passing a parameter to an Index view - c#

Pretty basic question here. How come I get a 404 error when I try to view
/Vendors/123
But I can see the page if I go to
/Vendors/Index/123
Is there any way for me to make it work the first way? I'm just using the default routes being registered in Global.asax.

Because that's how the default route is defined. If you don't want to specify an actionname you could modify it like this:
routes.MapRoute(
"Default",
"{controller}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
This being said you probably shouldn't be doing this because now in your route you do not have the possibility to specify the action name that you wish to invoke on a given controller which means that you can only have a single action on each controller and that action would be Index. On the other hand if you wanted to do this on some specific controller you could still preserve the default route and add another one:
routes.MapRoute(
"Vendors",
"vendors/{id}",
new { controller = "Vendors", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Because in your basic routing {id} expects after action name, but you are trying to put it after controller name.
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
Change your rout to accept {id} just after {controller}. Just like #Darin described.

Related

RegisterRoutes in Global.asax

I dont understand the RegisterRoutes perfectly. Lets assume the browser's current URL is
//Home/ListCompanies/{filter}
http://localhost:21047/Home/ListProducers/Yerli
we came to the address above with the link below
#Html.ActionLink("Yerli Markalar", "ListProducers/Yerli", "Home")
And I have a link on the current page like below
#Html.ActionLink("Bayiler", "ListCompanies", "Home")
http://localhost:21047/Home/ListCompanies/Yerli
But when I hover on the last link, it displays "Yerli" filter as well which I dont give it in the link
Why does the filter "Yerli" come here? It should seem like below
http://localhost:21047/Home/ListCompanies/
What am I doing wrong?
here are my Routes
routes.MapRoute(
null,
"Home/ListProducers/{filter}", // Route name
new { controller = "Home", action = "ListProducers", filter = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
null,
"Home/ListCompanies/{filter}", // Route name
new { controller = "Home", action = "ListCompanies", filter = UrlParameter.Optional } // Parameter defaults
);
Firstly, you do not use
#Html.ActionLink("Yerli Markalar", "ListProducers/Yerli", "Home")
If "Yerli" is the parameter to be passed to
public ActionResult ListProducers(string filter)
then it needs to be
#Html.ActionLink("Yerli Markalar", "ListProducers", "Home", new { filter = "Yerli" }, null)
which will generate ..../Home/ListCompanies/Yerli
Your problem is that you have generated the action parameter as ListCompanies/Yerli whereas it should be ListCompanies
Note you should also name your routes
routes.MapRoute(
"ListProducers", // name it!
"Home/ListProducers/{filter}", // Route name
new { controller = "Home", action = "ListProducers", filter = UrlParameter.Optional } // Parameter defaults
);
However, those routes seem unnecessary and you could just delete them and let the default route handle it
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
and just change the method to
public ActionResult ListProducers(string id)
and use
#Html.ActionLink("Yerli Markalar", "ListProducers", "Home", new { id = "Yerli" }, null)
which will produce exactly the same result

Custom URL in c# MVC 4

I'm trying to add custom URL to my application. For example, I have a report section and I want all the Controller in that section to start with "Report". Currently, my URL look like :
localhost:12345/MyReport
but I want it to look like
localhost:12345/Report/MyReport
MyReport is the name of my controller.
I tried to change the following code in Global.asax
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
By
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"Report",
"Report/{controller}/{action}/{id}",
new { controller = "MyReport", action = "Index", id = UrlParameter.Optional }
);
But I get a page not found error when I try to access localhost:12345/Report/MyReport... Any clue?
As crazy as this is at first, order matters. Routing will find the first route that matches, and serves it. Try putting the the default one after your new custom one.
Because of that, you're going to the controller of Report, and attempting to find the action of MyReport. Which is indeed not found.

Set default action (instead of index) for controller in ASP.NET MVC 3

I have a controller called Dashboard with 3 actions: Summary, Details, and Status, none of which take an ID or any other parameters. I want the URL /Dashboard to route to the Summary action of the Dashboard controller, as /Dashboard/Summary does, but I can't figure out the correct way to add the route. In Global.asax.cs, I have the following:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults
);
routes.MapRoute(
"/Dashboard",
"Dashboard",
new { controller = "Dashboard", action = "Summary" }
);
For the second part, I've also tried:
routes.MapRoute(
"/Dashboard",
"{controller}",
new { controller = "Dashboard", action = "Summary" }
);
and
routes.MapRoute(
"/Dashboard",
"{controller}",
new { action = "Summary" }
);
but I always get a 404 when trying to access /Dashboard. I'm pretty sure I'm missing something about the format for the parameters to MapRoute, but I don't know what it is...
Move your Dashboard route in front of the Default route:
routes.MapRoute(
"Dashboard",
"Dashboard/{action}",
new { controller = "Dashboard", action = "Summary" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults
);
The order of routes changes everything. Also, notice the changes I made to the Dashboard route. The first parameter is the name of the route. Second is the URL, which match URLs that start with Dashboard, and allows for other actions in your Dashboard controller. As you can see, it will default to the Summary action.
You need to declare the "Default" catch-all route last.
This set default Action for any Controller asp.net:
routes.MapRoute("Dashboard", "{controller}/{action}",
defaults: new { controller = "Dashboard", action = "Summary" });

Changing Route Values in global.asax

I would like to change my default route values.
Right now, I have:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
I would like to have: {controller}/{id}/{action}
It is not as simple as changing the value as I have already tried this. How do I approach this?
You will need 2 routes to accomplish this.
Just the rough idea, untested:
routes.MapRoute(
"Default", // Route name
"{controller}/{id}/{action}", // URL with parameters
new { controller = "Home", action = "Index", id=#"\d+" } // defaults
);
routes.MapRoute(
"Shorter", // Route name
"{controller}/{action}", // URL with parameters
new { controller = "Home", action = "Index" } // defaults
);
And do keep them in this order.
Not totally sure about the signature of the Actions, probably ActionResult Index(int? id)

MVC 3 How to use MapRoute

Could someone show me how to use the MapRoute method? I have tried creating my own routes, but it's not working. What i want to accomplish is a route that routes "http://servername/home/default.aspx" into controller "Home" and action "Default". Also, would it be possible to say that if the user is browsing the default.aspx "file", it would actually point to the "Index" action?
I have tried reading the MSDN references and googling, but it didn't make me any wiser.
Probably too late to help the developer who raised the question but may help someone else. New to MVC but what I found is the map routes seem to be processed in the order they are added. I had a similar problem, my specific route was not working until I started adding the default route as the last route.
If the default map route is added before your custom one and your custom URL matches the structure defined by the default map route you will never reach your custom route.
The route you want to configure the first part of your question is:
routes.MapRoute(
"",
"home/default.aspx",
new { controller = "Home", action = "Default" }
);
Assuming you wish to 'browse' default.aspx with some sort of parameter you can do something like:
routes.MapRoute(
"",
"home/default.aspx/{param}",
new { controller = "Home", action = "Default", param = UrlParameter.Optional }
);
And you would then need to create your Default action to accept string param.
You also have to make sure the parameter name is the same as the action's parameter name.
Example:
routes.MapRoute(
name: "MyName",
url: "{controller}/{action}/{myParam}",
defaults: new { controller = "MyController", action = "MyAction", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
MyController:
public ActionResult MyAction(string myParam = "")
{
}

Categories