2012-02-17 83 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