1

我希望可以选择为 UserName(可以更改)和 UserId 提供一个路由。通过这种方式,用户可以获得易于记忆的 URLUsers/{UserName}以及保证永远不会更改的 URLUsers/{UserId}

有什么办法可以避免必须为每条以用户为基础的路线编写 2 条路线?

从评论编辑

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

4

2 回答 2

0

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

于 2013-03-11T18:23:50.207 回答
0

要确定请求是传入 UserId 还是 UserName,您需要确定输入参数是 int 还是 string。为此,您有两种选择:

  1. 在行动方法中做出决定
  2. 在路由中做出决定。

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

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

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

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 是一个字符串,这是大多数应用程序的设置方式。

如果您想在路由中做出此决定,则必须设置两条路由,并使用路由约束来约束一个路由来处理整数输入参数和第二个路由来处理字符串输入参数.

于 2013-03-03T21:14:54.057 回答