Asp.net 以分页参数结尾的路由中的可选参数

Asp.net 以分页参数结尾的路由中的可选参数,asp.net,asp.net-mvc,routing,global-asax,Asp.net,Asp.net Mvc,Routing,Global Asax,我一直在创建一个博客,其中包含3种不同的观点。 -概述 -发布详细信息 -过滤概述 过滤的概述基于包含特定标记的blogpost,为了使url美观,我希望能够添加如下可选参数: mydomain.com/blog/<tagname>/<page> mydomain.com/blog/<tagname1>/<tagname2>/<page> mydomain.com/blog/<tagname1>/<tagname2&g

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

过滤的概述基于包含特定标记的blogpost,为了使url美观,我希望能够添加如下可选参数:

mydomain.com/blog/<tagname>/<page>
mydomain.com/blog/<tagname1>/<tagname2>/<page>
mydomain.com/blog/<tagname1>/<tagname2>/<tagname3>/<page>
mydomain.com/blog//
mydomain.com/blog///
mydomain.com/blog////
分页参数是半可选的,如果没有,则应为1。但在大多数情况下,它都会存在。 有什么办法可以很好地解决这个问题吗? 我能想到的唯一办法是在我的全球asax中创建许多行,这在我看来有点混乱


提前感谢,DerDee

在MVC中,您不能让可选参数出现在所需参数之前。一种解决方案是将paging参数置于tags参数之前:

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

您可以编写自定义路由:

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;
    }
}
然后你可以有一个博客控制器:

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

这是一个解决方案,但并非完全符合我的要求,因为分页参数始终位于末尾,我希望在URL中保持一致。现在我正在处理另一个问题,但尝试尽快实现Darin的解决方案,如果这不起作用,我想我没有其他选择来移动它。谢谢你的帮助这看起来像我正在寻找的,目前我正忙于实现一些不同的东西,但一旦我有时间,我会尝试实现这个方法。非常感谢您的帮助:)
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 }
    );
}
public class BlogController : Controller
{
    public ActionResult Index(string[] tags, int? page)
    {
        ...
    }
}