2009-02-06 151 views
0

我試圖實現路由有問題,如下列:與MVC路由

帖子/ 535434 /這 - 是 - 一 - 後標題

posts/tagged/tags+here 
// Matches {controller}/{action}/{id} - Default 
// Displays all posts with the specified tags 
// uses PostsController : ActionTagged(string tags) 

posts?pageSize=50&pageIndex=4 
// Matches {controller}/{action}/{id} - Default 
// Displays all posts 
// uses PostsController : Index(int? pageSize, int? pageIndex) 

這是我想的問題這樣做:

posts/39423/this-is-a-post-title-here 
// Typically this is implemented using an action like 'Details' 
// and would normally look like : posts/details/5 

我似乎無法得到路由工作的權利。我想是這樣的:

{controller}/{id}/{description} 

並設置默認操作爲「顯示」的作品,但後來也不會允許我導航到像「標記」等命名的動作。

我錯過了什麼?

謝謝!

回答

1

兩件事情:

首先,你應該經常整理你的航線減少的特異性(例如,最具體案例第一,至少特定情況下最後一個),這樣線路將「落空」,如果不匹配它將嘗試下一個。

所以我們要定義{控制器}/{}帖子ID/...(必須是一個帖子ID)之前,我們定義{控制器}/{行動}/...(可能是別的)

接下來,我們希望能夠指定,如果爲postid提供的值看起來不像Post ID,則路由應該失敗並進入下一個。

public class PostIDConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, 
    Route route, 
    string parameterName, 
    RouteValueDictionary values, 
    RouteDirection routeDirection) 
    { 
    //if input looks like a post id, return true. 
    //otherwise, false 
    } 
} 

我們可以將其添加到路由定義,像這樣:我們可以通過創建一個IRouteConstraint類做到這一點

routes.MapRoute(
    "Default", 
    "{controller}/{postid}/{description}", 
    new { controller = "Posts", action = "Display", id = 0 }, 
    new { postid = new PostIDConstraint() } 
); 
+0

好的答案。雖然問題。我需要在IRouteContraint中做些什麼?我從來沒有用過它,你能否再解釋一下。 – Micah 2009-02-06 13:06:10

0

我不是100%我明白你的問題,但它聽起來像你可以定義幾條不同的路線。

routes.MapRoute("PostId", "posts/{id}/{title}", 
    new { Controller = "Posts", Action = "DisplayPost", id = 0, title = "" }, 
    new { id = @"\d+" }); 

routes.MapRoute("TaggedPosts", "posts/tagged/{tags}", 
    new { Controller = "Posts", Action = "DisplayTagged", tags = "" }); 

routes.MapRoute("Default", "posts", 
    new { Controller = "Posts", Action = "Index" }); 

您可以使用正則表達式就像我在第一路用於ID驗證的參數,或者如果你想一些更好的驗證這樣做雷克斯中號公佈。查詢字符串參數pageSize和pageIndex不需要包含在您的路由中;只要參數名稱匹配,它們就會被傳遞給您的索引方法。