2012-01-15 58 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 
      );