2012-02-17 80 views
0

我一直在創建一個包含3個不同視圖的博客。 - 概述 - 發佈詳細 - 過濾概述路由結尾頁面參數中的可選參數

過濾後的概述是基於其含有一定標籤的相關博客文章,以使URL漂亮我很想得到它希望能夠添加可選的參數,如以下:

mydomain.com/blog/<tagname>/<page> 
mydomain.com/blog/<tagname1>/<tagname2>/<page> 
mydomain.com/blog/<tagname1>/<tagname2>/<tagname3>/<page> 

尋呼參數是半可選的,如果不是,它應該是1.但在大多數情況下,它將在那裏。 有沒有方法可以很好地解決這個問題? 我能想到的唯一方法是在我的全球asax中創建很多行,這使我覺得它有點混亂。

由於提前,DerDee

回答

1

你可以寫一個自定義路線:

public class BlogRoute : Route 
{ 
    public BlogRoute() 
     : base(
      "blog/{*info}", 
      new RouteValueDictionary(new 
      { 
       controller = "blog", 
       action = "index" 
      }), 
      new MvcRouteHandler() 
     ) 
    { 
    } 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var rd = base.GetRouteData(httpContext); 
     if (rd == null) 
     { 
      return null; 
     } 

     var info = rd.Values["info"] as string; 
     if (string.IsNullOrEmpty(info)) 
     { 
      return rd; 
     } 

     var parts = info.Split('/'); 
     if (parts.Length < 1) 
     { 
      return rd; 
     } 

     for (int i = 0; i < parts.Length; i++) 
     { 
      if (i == parts.Length - 1) 
      { 
       int page; 
       if (int.TryParse(parts[i], out page)) 
       { 
        rd.Values["page"] = page; 
       } 
      } 

      if (!rd.Values.ContainsKey("page")) 
      { 
       rd.Values[string.Format("tags[{0}]", i)] = parts[i]; 
      } 
     } 

     return rd; 
    } 
} 

將在Global.asax註冊:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.Add("BlogRoute", new BlogRoute()); 

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

,然後你可以有一個BlogController:

public class BlogController : Controller 
{ 
    public ActionResult Index(string[] tags, int? page) 
    { 
     ... 
    } 
} 
+0

這看起來像我一直在尋找的東西,現在我忙於實現一些不同的東西,但只要我有時間嘗試實施此方法。非常感謝你的幫助:) – DerDee 2012-02-17 10:09:51

1

你不能有可選參數來在MVC之前需要的參數。一個解決辦法是把尋呼參數標記參數之前:

mydomain.com/blog/<page>/<tagname> 
mydomain.com/blog/<page>/<tagname1>/<tagname2> 
mydomain.com/blog/<page>/<tagname1>/<tagname2>/<tagname3> 

然後,您可以給一個默認值路線中的頁面參數:

MapRoute(null, "blog/{page}/{*tagNames}", 
    new { controller = "Blogs", action = "ByPageAndTags", page = 1 }); 
+0

這是一個解決方案,但沒有完全我想要的東西,因爲尋呼參數總是在最後,我想保持它的網址是一致的。現在我正在處理另一個問題,但儘快實現達林的溶出度,如果這不行,我想我沒有其他選擇來移動它。感謝您的幫助 – DerDee 2012-02-17 10:08:45