1

我想要有一个UserName(可以更改)和UserId的路由选项。通过这种方式,用户可以得到一个简单的好处要记住网址Users/{UserName}有一个将保证永远不会改变Users/{UserId}如何保持URL路由DRY

沿着有什么办法来避免写2条路线有用户为基数每路线?从评论

编辑我想避免的方法处理这,还。我宁愿在路由中处理它。

+0

不,他们是不同的类型 – 2013-03-01 05:22:51

+0

第二个想法,你可以使用相同的路线的字符串,然后检查传递的参数是否可以被视为int。 – 2013-03-01 05:32:27

+0

@DaveA Yah,我想过那个,但是那看起来有点像哈克...... – 2013-03-01 05:36:49

回答

0

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

  1. 制作的操作方法
  2. 决心让路由的决心。

如果您在操作方法中做出决定,那么您可以在单个路由中处理这两种情况。您将通过设置路线如下处理这个问题:

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

然后,在您的主页控制器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,那么你可以认为它是一个用户名和相应的治疗。如果它不能被转换为int,他们可以假定它是一个UserName并作出相应的反应。

当然,这个解决方案是基于这样的假设:UserId是一个int,UserName是一个字符串,这是大多数应用程序的设置方式。

如果你想,而不是要进行这种确定路由,那么你就必须建立两个路由,并使用route contraints到contrain一个途径来处理是整数的输入参数和处理输入参数的第二条路线那就是字符串。

+1

如果你已经阅读过Dave A和我之间的评论,你会发现这已经被建议,并被视为一个hacky。我意识到这些可能是唯一的两个选项,但是想要设置没有两条基线的路由。另外,请不要更改标签,除非他们明显错误。我试图忽略ASP特定的标签,以防万一有另一种我可以模仿的语言的解决方案。 – 2013-03-04 02:58:48

0

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

+0

我已经在我的问题中回答了原因。我想要一个易变的路径(用户名是可变的),并且一个路径永远不会改变(用户标识符是不可变的)。这为易于记忆的路径提供了第一个选择,而第二个选项则确保了所有时间的保证 – 2013-03-11 18:50:20