带可选参数的MVC路由

时间:2011-03-25 06:00:01

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

我已设置此路线:

routes.MapRoute(
    "home3", // Route name
    "home3/{id}", // URL with parameters
    new { 
        controller = "home", 
        action = "Index", 
        id = UrlParameter.Optional } // Parameter defaults
);

但是在我的控制器中我不知道如何获取可选的id参数。有人可以解释我如何访问它以及我如何处理它存在或不存在。

由于

2 个答案:

答案 0 :(得分:16)

你可以像

一样编写动作方法
public ActionResult index(int? id)
{
   if(id.HasValue)
   {
       //do something  
   }
   else
   {
      //do something else
   }
}

答案 1 :(得分:8)

如何避免可为空的动作参数(和if语句)

正如您在@ Muhammad的回答中所看到的那样(BTW是一个被接受为正确答案的人),很容易将可选参数(实际上任何路由参数)转换为控制器动作。所有你必须确保它们是可空的(因为它们是可选的)。

但是因为它们是可选的,所以最终会出现分支代码,这对于维护单元测试更加困难。因此,通过使用一个简单的动作方法选择器,可以编写类似于此的东西:

public ActionResult Index()
{
    // do something when there's not ID
}

[RequiresRouteValues("id")]
public ActionResult Index(int id) // mind the NON-nullable parameter
{
    // do something that needs ID
}

在这种情况下使用了自定义操作方法选择器,您可以在my blog post中找到其代码和详细说明。这些行为易于掌握/理解,单元测试(没有不必要的分支)和维护。