【问题标题】:Optional parameters in routing ending with paging parameter路由中以分页参数结尾的可选参数
【发布时间】:2012-03-08 16:35:24
【问题描述】:

我一直在创建一个博客,其中包含 3 个不同的视图。 - 概述 - 发布详细信息 - 过滤概览

过滤后的概述基于包含特定标签的博文,为了使网址漂亮,我希望能够添加如下可选参数:

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

pageing 参数是半可选的,如果没有,它应该是 1。但在大多数情况下,它会在那里。 有没有办法很好地解决这个问题? 我能想到的唯一方法是在我的全局 asax 中创建很多行,这在我看来有点混乱。

提前致谢,DerDee

【问题讨论】:

    标签: asp.net asp.net-mvc routing global-asax


    【解决方案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)
        {
            ...
        }
    }
    

    【讨论】:

    • 这看起来像我一直在寻找的东西,目前我正忙于实现一些不同的东西,但一旦我有时间我会尝试实现这个方法。非常感谢您的帮助:)
    【解决方案2】:

    在 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 });
    

    【讨论】:

    • 这是一个解决方案,但不完全是我想要的,因为分页参数总是在最后,我想在 URL 中保持一致。现在我正在处理另一个问题,但尝试尽快实施达林的解决方案,如果这不起作用,我想我没有其他选择来移动它。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2012-03-24
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多