Model view controller 如何保持URL路由干燥

Model view controller 如何保持URL路由干燥,model-view-controller,routing,routes,asp.net-mvc-routing,url-routing,Model View Controller,Routing,Routes,Asp.net Mvc Routing,Url Routing,我想有一个选项,有一个用户名路由(可以更改)和一个用户名路由。通过这种方式,用户可以获得易于记忆的URLUsers/{UserName}以及保证永远不会更改的URLUsers/{UserId} 有没有办法避免为每个以用户为基础的路由写2条路由 根据评论编辑 我也希望避免在方法中处理这个问题。我宁愿在路由中处理它。要确定请求传递的是用户ID还是用户名,需要确定输入参数是int还是字符串。对此,您有两个选项: 用动作法进行判断 在路由中进行确定 如果在action方法中进行确定,则可以在单个路由中处

我想有一个选项,有一个用户名路由(可以更改)和一个用户名路由。通过这种方式,用户可以获得易于记忆的URL
Users/{UserName}
以及保证永远不会更改的URL
Users/{UserId}

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

根据评论编辑


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

要确定请求传递的是用户ID还是用户名,需要确定输入参数是int还是字符串。对此,您有两个选项:

  • 用动作法进行判断
  • 在路由中进行确定
  • 如果在action方法中进行确定,则可以在单个路由中处理这两种情况。您可以通过如下方式设置路线来处理此问题:

    routes.MapRoute("", "User/{userSpecifier}",
        new { controller = "Home", action = "Index" });
    
    然后,在主控制器的Index action方法中,需要通过如下代码检查输入参数是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,您可以假定它是用户名,并做出相应的反应

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


    如果您想在路由中进行此确定,则必须设置两条路由,并使用一条路由来处理整数输入参数,另一条路由来处理字符串输入参数。

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

    不,b/c它们是不同的类型。我第二个想法是,你可以对字符串使用相同的路径,然后检查传递的参数是否可以被视为int。@DaveA-Yah,我考虑过,但这似乎有点骇人听闻……是的。但是如果你想限制一条路线,有什么选择呢?@DaveA嗯,我希望通过这个问题找到另一个选择:)如果你读了Dave A和我之间的评论,你会发现这已经被建议并被认为是一个黑客。我意识到这可能是仅有的两个选项,但我希望有一种方法可以在没有两个基线的情况下设置路由。此外,请不要更改标签,除非它们完全错误。我试图忽略ASP特定的标记,主要是为了防止我可以模仿另一种语言的解决方案。我已经在问题中回答了原因。我想要一个易变的路径(用户名是可变的),和一个永远不会改变的路径(用户名是不可变的)。这使得第一种选择易于记忆,而第二种选择可以保证一直存在