2012-01-15 60 views
3

我想创建一个简单的路线,这将允许我只有一个项目列出基地址(除了它是一个控制器之外),并且该项目作为参数传递给控制器​​。例如:MVC 3通配符路线即www.mydomain.com/username

www.mydomain.com/user1 www.mydomain.com/user2 www.mydomain.com/user3 www.mydomain.com/user3

其中用户1,用户2等是用户名,和正在被动态传递,即我不想为每个用户名创建一个控制器。

当然我想确保如果像这样的事情是可能的,它不会导致与其他真正的控制器名称冲突,因此我猜其他控制器将不得不有规则创建专门为他们和上面的通配符路线

我不知道如何做到这一点,因为我猜测斜杠后的第一项通常是一个控制器。

任何想法如何解决这个问题?

我提供的例子可能看起来模糊不清,当我把www.mydomain.com/user1等表示它可能是任何东西(即用户名),例如www.mydomain.com/jsmith, www.mydomain .com/djohnson,www.mydomain.com/sblake,www.mydomain.com/fheeley

这个想法是,只需输入域名,然后输入正斜杠和用户名即可查找用户配置文件。

回答

1

ASP.Net MVC路由是从上到下的过程,只要找到匹配,它就不会再进行匹配。因此,请首先放置最具体的路线,然后将通配符路线放在最后。如果没有特定的路由匹配,控制权将被传递到通配符路由。

1

使用路由定义如

routes.MapRoute("{username}", new { controller = "User", action = "View"});

在你的Global.asax.cs文件但把它放在最后在你的路由定义列表。

MVC从上到下处理您的路线映射,所以把你最常用的途径映射在顶部,而你在底部更具体的。

完成这一步之后,您将需要相应的控制器/行动,以便创建一个名为“UsersController”与“观”的操作新的控制器,就像如下:

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); 
     } 
    } 
} 
0

你必须做以下事情。

  1. 创建一个控制器或操作以处理上述情形。例如控制器= “家” 和行动= “的getUser” 公众的ActionResult的getUser(用户名字符串){// 做你的工作 }
  2. 在全球。ASAX(上线) //再看点3 UserNameConstraint

    route.MapRoute("UserRoute" , "{username}" , new { controller="Home" , action="GetUser" } , new { username = new UserNameConstraint() }); 
    

    //把你的默认路由后,上述这里

  3. 现在对于创建路由约束。

希望这对你有所帮助。

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()); 
    } 
    } 
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 
      );