views:

17

answers:

1

As a beginner in MVC I'm trying to figure out what's the best way to accomplish a route for my needs, and I'm getting no luck at all, so I'm kindly ask for any help

My webApp is driven by Calendars, and per each Calendar there are a bunch of actions

  • Subscribe
  • Edit Calendar
  • View Winners
  • Daily Challenge
  • etc...

and I would like to avoid passing something like

mydomain.com/calendar/2

my idea would be to hide the ID so no one can have logical access to other calendars, for example

mydomain.com/q2tsT

where q2tsT could be a 10 char random generated string and then I would like to have routes such as:

mydomain.com/q2tsT/subscribe
mydomain.com/q2tsT/daily-challenge
mydomain.com/q2tsT/winners
mydomain.com/q2tsT/prizes

How would I set up my Route to perform like this?

something like:

routes.MapRoute(
    "CalendarRoute",
    "{calendar}/{controller}/{action}/{id}",
    new { 
        calendar = "Empty", 
        controller = "Frontend", 
        action = "Index", 
        id = UrlParameter.Optional }
);

but what will I do with the calendar? where do I pick it up so I can convert to an ID so querying the DB would be faster

I'm kinda lost here :(

+1  A: 

Firstly, even by 'hiding' the calendar ID behind a string there is still nothing to stop a user from trying to guess an appropriate ID. Whatever solution you use will need to have security built in to the actions to ensure the appropriate data is only shown to authorized users.

To get the calendar - just pass the string value into your action method and decode it there.

routes.MapRoute(
    "CalendarRoute",
    "{calendar}/{controller}/{action}/{id}",
    new { 
        calendar = "Empty", 
        controller = "Frontend", 
        action = "Index", 
        id = UrlParameter.Optional }
);

public ActionResult Index(string calendar, int? id) {
   // decode the calendar into something useful
...    
}
Clicktricity
Yes, I do realize that, but with a 10 random char string it's a little harder that a numeric value, and that was all I wanted to accomplish. Thank you for the heads up, works great !
balexandre