2011-09-22 125 views
35

我需要一個實現,我可以在我的ASP.NET控制器上獲得無限參數。這將是更好,如果我給你舉個例子:ASP.NET MVC無限URL參數路由

讓我們假設我有以下網址:

example.com/tag/poo/bar/poobar 
example.com/tag/poo/bar/poobar/poo2/poo4 
example.com/tag/poo/bar/poobar/poo89 

正如你所看到的,example.com/tag/後,將獲得的標籤無限數量和削減將是一個在這裏分隔。

在控制器上,我想這樣做:

foreach(string item in paramaters) { 

    //this is one of the url paramaters 
    string poo = item; 

} 

是否有任何已知的方式來實現這一目標?我怎樣才能達到控制器的價值?用Dictionary<string, string>List<string>

注:

的問題沒有得到很好的解釋IMO,但我盡我所能,以適應它。 。 在隨意調整它

回答

54

像這樣:

routes.MapRoute("Name", "tag/{*tags}", new { controller = ..., action = ... }); 

ActionResult MyAction(string tags) { 
    foreach(string tag in tags.Split("/")) { 
     ... 
    } 
} 
+1

嗯,看起來很整潔。要試一試。 – tugberk

+0

{* tags}在那裏有什麼作用?特別是,*。 – tugberk

+7

這是一個全面的參數。 http://msdn.microsoft.com/en-us/library/cc668201.aspx#handling_a_variable_number_of_segments_in_a_url_pattern – SLaks

25

漁獲都將給你的原始字符串。如果你想要一個更優雅的方式來處理數據,你總是可以使用自定義路由處理程序。

public class AllPathRouteHandler : MvcRouteHandler 
{ 
    private readonly string key; 

    public AllPathRouteHandler(string key) 
    { 
     this.key = key; 
    } 

    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var allPaths = requestContext.RouteData.Values[key] as string; 
     if (!string.IsNullOrEmpty(allPaths)) 
     { 
      requestContext.RouteData.Values[key] = allPaths.Split('/'); 
     } 
     return base.GetHttpHandler(requestContext); 
    } 
} 

註冊路由處理程序。

routes.Add(new Route("tag/{*tags}", 
     new RouteValueDictionary(
       new 
       { 
        controller = "Tag", 
        action = "Index", 
       }), 
     new AllPathRouteHandler("tags"))); 

將標籤作爲控制器中的數組獲取。

public ActionResult Index(string[] tags) 
{ 
    // do something with tags 
    return View(); 
} 
5

萬一有人要來此與MVC在.NET 4.0中,你必須要小心其中定義您的路線。我很高興地去global.asax並添加這些答案(和其他教程)中建議的路線,並且無處可去。我的路線全部默認爲{controller}/{action}/{id}。向URL添加更多的段給了我一個404錯誤。然後我發現了App_Start文件夾中的RouteConfig.cs文件。原來這個文件在Application_Start()方法中被global.asax調用。因此,在.NET 4.0中,確保您在那裏添加自定義路由。 This article精美地覆蓋它。