Custom routing within an area - asp.net-mvc-2

i have an Area called Members and the following registered routes in the MembersAreaRegistration file:
context.MapRoute(
"Members_Profile",
"Members/Profile/{id}",
new { controller = "Profile", action = "Index", id = UrlParameter.Optional },
new string[] { "MyProject.Web.Mvc.Areas.Members.Controllers" }
);
context.MapRoute(
"Members_default",
"Members/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "MyProject.Web.Mvc.Areas.Members.Controllers" }
);
I want to be able to map the following URLs:
~/Members (should map ~/Members/Home/Index )
~/Members/Profile/3 (should map ~/Members/Profile/Index/3)
With this route registrations everything works fine. However, I added the following URL:
~/Members/Profile/Add
and I got the error:
"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Index(Int32)' in 'MyProject.Web.Mvc.Areas.Members.Controllers.ProfileController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
I also want to have the URL
~/Members/Profile/Edit/3
What should I modify in order to have all this URLs working properly?

You will need to add a couple of additional routes, BEFORE the routes you have already defined. This is because these are specific routes that you want picked before the more generic routes you already have.
context.MapRoute(
"Members_Profile",
"Members/Profile/Add",
new { controller = "Profile", action = "Add" },
new string[] { "MyProject.Web.Mvc.Areas.Members.Controllers" }
);
context.MapRoute(
"Members_Profile",
"Members/Profile/Edit/{Id}",
new { controller = "Profile", action = "Edit", id = UrlParameter.Optional },
new string[] { "MyProject.Web.Mvc.Areas.Members.Controllers" }
);

Related

MVC routing not working when default and custom route refer to same controller

I have two routers in my global.asax, one is a default router which is like:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "Test", action = "Action1", id = UrlParameter.Optional }
);
and other is Custom router:
routes.MapRoute(
"CustomRouter", // Route name
"Test/{id}/{FacetString}/{CurrPageNo}",
new { controller = "Test", action = "Action12", id = "", FacetString = UrlParameter.Optional, CurrPageNo=UrlParameter.Optional }
);
some how when I pass url "http://localhost/Test/1001/State=TX" the second router should get executed but some how its not executing.
I had read that the sequence of router is important, hence I tried to exchange there sequence, but it is still not working, if I place it above default router than, the cutom router gets called for all the other actions in that router, which should not happen
the last URL-component State=TX looks like a query string parameter to me. Shouldn't it be ?State=TX (which then wouldn't match your route) or /State/TX
it seems like you should use constraints, reducing match rate for your custom router. You can use forth parameter to define your constraints. In this case it can be something like this
routes.MapRoute(
"CustomRouter", // Route name
"Test/{id}/{FacetString}/{CurrPageNo}",
new { controller = "Test", action = "Action12", id = "", FacetString = UrlParameter.Optional, CurrPageNo=UrlParameter.Optional
, new {id=#"\d+"});
in this way your second URL section requires to be numeric in order to get executed.
According your second route your url should be in one of these formats
http://localhost/Test/1001
http://localhost/Test/1001/State
http://localhost/Test/1001/State/3
Also there is no need of controller = "Test", action = "Action12" as they are not part of the second route definition
Have a look at this MSDN link on ASP.NET routing

Asp.net Mvc 2 How to reroute to www.example.com/my-profile

i would like to reroute this address www.exmaple.com/my-profile to a profile controller i have in my mvc application. There is my global.aspx, as you can the the default routing is
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}/", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
This is the Maproute i'm trying to use to reroute to www.exmaple.com/my-profile
routes.MapRoute(
"Profile", // Route name
"{profile_name}/", // URL with parameters
new { controller = "Portfolio", action = "Index", page = UrlParameter.Optional } // Parameter defaults
);
The problem is when i type www.exmaple.com/profile it trys to direct me to the default maproute, not the one i have specified.
But when i can do this www.example.com/profile/my-profile
routes.MapRouteLowercase(
"Profile", // Route name
"profile/{profile_name}/", // URL with parameters
new { controller = "Portfolio", action = "Index", page = UrlParameter.Optional } // Parameter defaults
);
it works fine, but i dont want to add profile before my-profile. I would like it to work like facebook.com/my-profile or youtube.com/my-profile.
Does anyone one know how i accomplish this, i have been looking for a solution for over 2 months (on and off)
Thanks
Your routing if I remember rightly will return the first matching pattern for the URL. I would expect in your case, your URL is matching your default pattern first.
Move your more specific route above your 'default' route and see if this helps.

ASP MVC RedirectToAction passing an array of objects without using ViewData

I have the following method
public ActionResult Search(FormCollection form)
{
.......
Publication[] publicationsResult = server.SearchLibrary(this.getSession(), sq);
return RedirectToAction("BookListing", new { publications = publicationsResult });
}
Which gets a list of publications from the server and stores it in an array of type Publication.
I would like to show the results in another page, thus I redirected to the following method:
public ActionResult BookListing(Publication[] publications)
{
Publication[] p = publications;
return View(publications);
}
And I also have the following Routes defined:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Library", action = "Search", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"PublicationListing", // Route name
"{controller}/{action}/{publications}", // URL with parameters
new { controller = "Library", action = "BookListing", publications = UrlParameter.Optional } // Parameter defaults
);
When in Search the publications array is populated with over 13000 objects, however when I redirect to BookListing null is passed.
Is there a way to pass an array of objects from one action method to another using RedirectToAction?
Thanks.
You always have the TempData collection. This is persisted between the action redirects for a single request and so provides you with storage for anything like this...

asp.net mvc2 Routes

So I have added this route to my map:
routes.MapRoute(
"Default",
"/Bikes/{id}",
new { controller = "Bike", action = "Detail" }
);
But for SEO reasons we need to have urls like: /bikes/54/name-of-bike/kind-of-bike/number-of-wheels ... etc etc. But everything after id (54) can be ignored.
Does anyone know how to create such a MapRoute to allow that, the route above does not work actually for urls that contain stuff after the id.
You can use a catchall parameter like so
routes.MapRoute(
"Default",
"/Bikes/{id}/{*stuff}",
new { controller = "Bike", action = "Detail", stuff = UrlParameter.Optional }
);
then anything after id will be stored in stuff
Something like this
routes.MapRoute(
"Default",
"/Bikes/{id}/{slug*}",
new { controller = "Bike", action = "Detail",
slug = UrlParameter.Optional}
);

Problem with custom routes

I'm using the following route
routes.MapRoute(
"PatientList",
"User/{SearchName}/{LocationID}/{Page}",
new { controller = "User", action = "Index", SearchName = "", LocationID = 0, Page = 1 }
);
It fails on the following URL: /user//1/1
Can anyone tell me what I'm doing wrong?
The URL /user//1/1 is interpreted by ASP.NET as a request for /user/1/1. Only the last parameters can be optional. You can't skip a parameter this way.