Asp.net 以分页参数结尾的路由中的可选参数
我一直在创建一个博客,其中包含3种不同的观点。 -概述 -发布详细信息 -过滤概述 过滤的概述基于包含特定标记的blogpost,为了使url美观,我希望能够添加如下可选参数: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
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)
{
...
}
}