我们如何处理类似{calendar} / {controller} / {action} / {id}的内容

时间:2010-10-07 10:29:57

标签: asp.net-mvc-2 routing asp.net-mvc-routing

作为MVC的初学者,我正在努力找出满足我需求的最佳方式我根本没有运气 ,所以我很乐意寻求帮助

我的webApp由日历驱动,每个日历都有一系列操作

  • 订阅
  • 修改日历
  • 查看获奖者
  • 每日挑战
  • 等...

我希望避免传递类似

的内容
mydomain.com/calendar/2

我的想法是隐藏 ID所以没有人可以对其他日历进行逻辑访问,例如

mydomain.com/q2tsT

其中q2tsT可以是10个字符随机生成的字符串,然后我想要路由,例如:

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

如何设置路线以执行此操作?

类似的东西:

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

但我会对calendar做些什么?我在哪里拿起所以我可以转换为ID,这样查询数据库会更快

我有点迷失在这里:(

1 个答案:

答案 0 :(得分:1)

首先,即使将日历ID“隐藏”在字符串后面,仍然没有什么可以阻止用户尝试猜测适当的ID。无论您使用何种解决方案,都需要在操作中内置安全性,以确保仅向授权用户显示相应的数据。

要获取日历 - 只需将字符串值传递给您的操作方法并在那里解码。

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
...    
}