如何保持URL路由DRY

时间:2013-03-01 05:09:47

标签: model-view-controller routing routes asp.net-mvc-routing url-routing

我希望可以选择为UserName(可以更改)和UserId设置一个路径。通过这种方式,用户可以获得易于记忆的网址Users/{UserName}以及保证永不改变的网址Users/{UserId}

有没有办法避免为每个以用户为基础的路由编写2条路由?

来自评论的编辑

我也想避免在方法中处理这个问题。我宁愿在路由中处理它。

2 个答案:

答案 0 :(得分:0)

要确定请求是在UserId还是UserName中传递,您需要确定输入参数是int还是字符串。您有两种选择:

  1. 在操作方法中进行确定
  2. 在路由中做出决定。
  3. 如果您在操作方法中进行确定,则可以在单个路径中处理这两种情况。您可以通过设置以下路线来处理此问题:

    routes.MapRoute("", "User/{userSpecifier}",
        new { controller = "Home", action = "Index" });
    

    然后,在Home控制器的Index操作方法中,您需要通过以下代码检查输入参数是int还是字符串:

    public ActionResult Index(string userSpecifier)
    {
        int userId = 0;
        if(int.TryParse(userSpecifier, out userId))
        {
            //It is an int, and userId contains the user Id, so process accordingly
        }
        else
        {
            //It is not an int, so treat userSpecifier as username and process accordingly
        }
        ....
    
        return View();
    }
    

    因此,如果传递给“userSpecifier”输入参数的字符串可以转换为int,那么您可以假设它是UserId并相应地对其进行处理。如果它无法转换为int,则可以假设它是UserName并做出相应的反应。

    当然,这个解决方案的前提是UserId是一个int,UserName是一个字符串,这就是大多数应用程序的设置方式。

    如果你想在路由中做出这个决定,那么你必须设置两个路由,并使用route contraints来限制一个路由来处理整数的输入参数和第二个路由到处理作为字符串的输入参数。

答案 1 :(得分:0)

我想我首先会问你为什么需要两者引用?如果这是一个Web API路由(即restful),那么通常只有一个get方法用于用户API调用。我当然不是说你做的是错的!我只是问是否真的需要两种检索用户的方法?