2012-05-21 204 views
0

在asp.net mvc的使用缺省路由和使用ActionLink的ASP.NET MVC 3路由問題

@Html.ActionLink("title", "Index", "Question", new { id = 25}, null) 

的結果是:

http://localhost/question/index/25 

改變鏈接

http://localhost/question/25 

我在Global.asax中默認添加了新的路由角色:

routes.MapRoute(
      "default2", // Route name 
      "Question/{id}", // URL with parameters 
      new { controller = "Questions", action = "Index", id = UrlParameter.Optional} // Parameter defaults 
     ); 

我有同樣的問題用戶,標籤,...,我應該爲每個主題創建相同的角色嗎?

+0

你在哪裏添加路由?如果您在{controller}/{action}/{id}的默認MVC路徑之後添加了它,則需要將其移至默認路徑上方。此外,你不能有兩個具有相同名稱的路線,所以我建議調用這條路線「問題」或什麼。 –

+0

@NickBork,你說得對。我在'default'之前添加了這條路線。和名稱不同(更新後) – Mironline

+1

那麼移動路由位置會導致ActionLink生成正確的actionlink代碼?如果是這樣,您可以創建另外兩條路線,一條用於「用戶」,另一條用於「標籤」,或者您可以修改新路線並使用路線約束進行一些過濾以僅匹配「問題」,「用戶」或「標籤」 –

回答

2

你試過嗎?

routes.MapRoute(
     "", 
     "{controller}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

UPDATE:

如果id始終將是一個整數,那麼你可以把一個簡單的數字限制在上面的路線,以避免@Nick報道的路由問題。

routes.MapRoute(
     "my-route", 
     "{controller}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     new { id = @"\d*" } 
); 
+0

是的,我試過了。但我認爲這條路線直接影響'形式'。我不知道爲什麼,但是當我使用這條路線時,'action'屬性的形式是空的**! – Mironline

+1

如果使用此路由,{controller}/{action}/{id}的默認路由永遠不會匹配,因爲您的新路由始終是匹配項,每個URL都會查找索引操作。爲了使這條路線起作用,您需要創建一個路由約束來確保ID是有效的(數字值或數據庫中存在的)。 –

1

我想我會藉此更進一步,向您展示如何創建一個路由約束,所以你並不需要註冊三個獨立的路線。

使用下面的文章爲指導,你可以創建一個約束,將驗證對控制器列表當前路由控制器將指定:

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-custom-route-constraint-cs

因此,這裏是我的類路徑約束:

public class ControllerConstraint : IRouteConstraint 
{ 
    private string[] _controllers; 

    public ControllerConstraint() : this(null) { } 
    public ControllerConstraint(string[] controllers) 
    { 
     _controllers = controllers; 
    } 

    #region IRouteConstraint Members 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     string currentController = values.ContainsKey("controller")? values["controller"].ToString() : null; 

     return _controllers != null //The list of controllers passed to the route constraint has at least one value in it 
      && !String.IsNullOrEmpty(currentController) //The current route data has a controller in it to compare against 
      && (from c in _controllers where c.Equals(currentController,StringComparison.CurrentCultureIgnoreCase) select c).ToList().Count > 0; //We find a match of the route controller against the list of controllers 
    } 
    #endregion 
} 

從那裏,你需要做的是修改你如何在Globa.asax

註冊您的路線3210
routes.MapRoute(
     "Action-less Route", // Route name 
     "{controller}/{id}", // URL with parameters 
     new { controller = "Questions", action = "Index", id = UrlParameter.Optional}, //Parameter defaults 
     new {isController = new ControllerConstraint(new string[] {"Questions","Users","Tags"})} //Route Constraint 
     ); 

你也可以把它更進一步,驗證(編號)與附加的路由約束類似下面的號碼:

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs