asp.net mvc how to map different view to different controller when views in the same folder? - asp.net-mvc-routing

I have a question on asp.net mvc routing. How can I map two views within the same folder to different two controllers?
Controllers => TestFolder =>
Test1Controller
Test2Controller
Views => TestFolder =>Test1.cshtml Test2.cshtml
This is MapRoute I have now:
routes.MapRoute(
"Test1",
"Test1/{action}/{id}",
new { controller = "Test1", action = "Test1", id = UrlParameter.Optional }
);
routes.MapRoute(
"Test2",
"Test2/{action}/{id}",
new { controller = "Test2", action = "Test2", id = UrlParameter.Optional }
);
Thanks in advance

You don't map routes to views, you map routes to controllers and actions.
In your Test1Controller.Test1 method, return View("Test1").
In your Test2Controller.Test2 method, return View("Test2").

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.

Custom routing within an area

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" }
);

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}
);

Content-Aware Route Mapping in ASP.NET MVC 2

I am working with ASP.NET MVC 2 and would like to optimize my routing. The desired result is as follows:
http://www.url.com/Sites/
http://www.url.com/Sites/Search/NY001
http://www.url.com/Sites/NY001
http://www.url.com/Sites/NY001/Photos
The problem with this scenario is that I want to treat the URL bits differently depending on their content, in a sense. As one can imagine, "NY001" is the identifier for a specific site, not for an action that lives in the Sites controller. My current solution is to define a special route map for the site-specific URLs and to specify each action in the Sites controller separately before that.
// currently in place, works
routes.MapRoute("SiteList", "Sites", new { controller = "Sites", action = "Index" });
routes.MapRoute("SiteSearch", "Sites/Search/{searchString}", new { controller = "Sites", action = "Index", searchString = "" });
routes.MapRoute("SiteNotFound", "Sites/NotFound", new { controller = "Sites", action = "NotFound" });
// and so on...
routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index", siteId = "" });
As this is one of the central components of my web application, these actions are growing daily and the list is getting a bit unwieldy. I would love to be able to distill the long list of action-specific routes to a single declaration, similar to this:
routes.MapRoute("Sites", "Sites/{action}/{id}", new { controller = "Sites", action = "Index", id = UrlParameter.Optional });
The problem is that the routing framework has no way of differentiating between this new route and the site-specific one in the above example; therefore, both are matches. Am I stuck with declaring each action separately? Should I consider using a regular expression to differentiate based on the URLs' content?
Thanks in advance and I apologize in advance if this question has already been asked in a different form.
Not sure what exactly you want to accomplish. Of course you can't really map URLs with different signatures with one route, but you can reduce the list like this:
routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index" }, new { action = "(?:Index|Photos|News)", siteId = #"[A-Z0-9]+" });
for urls:
http://www.url.com/Sites/NY001
http://www.url.com/Sites/NY001/Photos
http://www.url.com/Sites/NY001/News
This route will only map to actions Index, Photos, News (and whatever else you put in that reg. expression).