Model view controller 如何保持URL路由干燥
我想有一个选项,有一个用户名路由(可以更改)和一个用户名路由。通过这种方式,用户可以获得易于记忆的URLModel 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方法中进行确定,则可以在单个路由中处
Users/{UserName}
以及保证永远不会更改的URLUsers/{UserId}
有没有办法避免为每个以用户为基础的路由写2条路由
根据评论编辑
我也希望避免在方法中处理这个问题。我宁愿在路由中处理它。要确定请求传递的是用户ID还是用户名,需要确定输入参数是int还是字符串。对此,您有两个选项:
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特定的标记,主要是为了防止我可以模仿另一种语言的解决方案。我已经在问题中回答了原因。我想要一个易变的路径(用户名是可变的),和一个永远不会改变的路径(用户名是不可变的)。这使得第一种选择易于记忆,而第二种选择可以保证一直存在