我想创建一个简单的路由,它允许我在基本URL之后只列出一个项目(除了它是控制器之外),并且该项目作为参数传递给控制器。例如:
www.mydomain.com/user1 www.mydomain.com/user2 www.mydomain.com/user3 www.mydomain.com/user3
其中user1,user2等是用户名并且正在动态传递,即我不想为每个用户名创建一个控制器。
当然我想确保这样的事情是否可能导致它不会与其他真正的控制器名称发生冲突,因此我猜其他控制器必须专门为它们创建规则并列在通配符路由之上
我不知道怎么做,因为我猜斜杠后的第一项通常是控制器。
任何想法如何解决这个问题?
我提供的示例可能看起来很模糊,当我把www.mydomain.com/user1等表示它可以是任何东西(即用户名),例如www.mydomain.com/jsmith,www.mydomain。 com / djohnson,www.mydomain.com / sblake,www.mydomain.com / fheeley
这个想法是只需输入域名然后输入一个斜杠和用户名即可查找用户个人资料。
答案 0 :(得分:1)
ASP.Net MVC路线是从上到下的过程,一旦找到匹配,它就不会再看到匹配。因此,首先放置您最具体的路线,然后将您的通配路线放在最后。如果没有特定路由匹配,则控制将传递到通配符路由。
答案 1 :(得分:1)
使用路径定义,例如
routes.MapRoute("{username}", new { controller = "User", action = "View"});
在您的global.asax.cs文件中,但将其放在路线定义列表的最后。
MVC从上到下处理您的路由映射,因此将最常用的路由映射放在顶部,将更具体的路由映射放在底部。
执行此操作后,您将需要相应的控制器/操作,因此创建一个名为“UsersController”的新Controller,其操作名为“View”,如下所示:
using System.Web.Mvc;
namespace Routes.Controllers
{
public class UsersController : Controller
{
//
// GET: /{username}
public ActionResult List(string username)
{
// Get User from database/repository and pass to view
var user = ...;
return View(user);
}
}
}
答案 2 :(得分:0)
你必须做以下事情。
在Global.asax(热门路线) //查看UserNameConstraint的第3点
route.MapRoute("UserRoute" , "{username}" , new { controller="Home" , action="GetUser" } , new { username = new UserNameConstraint() });
//将您的默认路线放在上面
希望这对你有所帮助。
public class UserNameConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
List<string> userName = GetUserName from DB
userName.Contain(values[parameterName].ToString());
}
}
答案 3 :(得分:0)
创建如下路线
routes.MapRoute(
"DefaultWithUser", // Route name
"{user}/{controller}/{action}/{id}", // URL with parameters
new { user=UrlParameter.Optional, controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);