我有一个webforms项目,我使用System.Web.Routing.RouteCollection.MapPageRoute来重写URL,但是我遇到了一些动态URL的问题。我的网址可能如下所示;
/folder/city-1-2-something.aspx
,MapPageRoute就是这个
routeCollection.MapPageRoute("CompanyCity", "folder/city-{id}-{pid}-{title}.aspx", "~/mypage.aspx");
但我已经意识到某些网址可能看起来像这样
/folder/city-2-2-something-something.aspx
/folder/city-2-2-something-something-something.aspx
/folder/city-2-2-something-something-something-something.aspx
并且我的路由选择不正确 - 第一个例子最终会得到结果id = 2-2和pid = something而不是id = 2和pid = 2.
{title}并不重要 - 仅使用{id}和{pid}。我有几个类似的路由到特定的文件夹,所以我可以se我不能使用catch all。但是我该如何解决这个问题呢?
答案 0 :(得分:1)
下面的简单RouteConfig包含一个与您需要的匹配的TestRoute。仅此而已,所以它在某种意义上是非常糟糕的代码。
但我们的想法是,现在可以使用正则表达式,它可以很容易地满足您的需求。 (命名组“id”(?<id>\d)
和“pid”(?<pid>\d)
仅匹配数字(\d
)为什么它们只匹配到下一个破折号。)
希望它能带来一些灵感。
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace InfosoftConnectSandbox
{
public class RouteConfig
{
class TestRoute : RouteBase
{
Regex re = new Regex(@"folder/city-(?<pid>\d)-(?<id>\d)-.*");
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var data = new RouteData();
var url = httpContext.Request.Url.ToString();
if (!re.IsMatch(url))
{
return null;
}
foreach (Match m in re.Matches(url))
{
data.Values["pid"] = m.Groups["pid"].Value;
data.Values["id"] = m.Groups["id"].Value;
}
data.RouteHandler = new PageRouteHandler("~/mypage.aspx");
return data;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return new VirtualPathData(this, "~/mypage.aspx");
}
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new TestRoute());
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}