2012-02-17 2 views
0

私は3つの異なるビューを含むブログを作成しています。 - 概要 - 投稿の詳細 - ろ過概要ページングパラメータで終わるルーティングのオプションパラメータ

フィルタ処理の概要は、私はそれが次のようにオプションパラメータを追加できるようにしたいもらうのが大好きだURLをきれいにするために、特定のタグが含まれているブログ記事に基づいています:それは1でなければなりません。しかし、ほとんどの場合、それはあるでしょうがない場合

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

pageingパラメータは、半オプションです。 この問題をうまく解決する方法はありますか? 私が考えることができる唯一の方法は、自分の意見では面倒なように私のグローバルな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

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

ページング・パラメータは、私はURLで、それは一貫していきたいと思い末尾に常にあるので、これは、私が欲しいものではない完全なソリューションですが、。今私は別の問題に取り組んでいるが、ダーリンの解決策をできるだけ早く実行しようとする。もし動かなければ他の選択肢がないと思う。あなたの助けをありがとう – DerDee

関連する問題