我正在使用System.Web.Routing和ASP.NET(3.5)Web窗体,它将URL重写以下URL
到
代码如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add("CampaignRoute", new Route
(
"{campaign_code}",
new CustomRouteHandler("~/default.aspx")
));
}
IRouteHandler实施:
public class CustomRouteHandler : IRouteHandler
{
public CustomRouteHandler(string virtualPath)
{
VirtualPath = virtualPath;
}
public string VirtualPath { get; private set; }
public IHttpHandler GetHttpHandler(RequestContext
requestContext)
{
if (requestContext.RouteData.Values.ContainsKey("campaign_code"))
{
var code = requestContext.RouteData.Values["campaign_code"].ToString();
HttpContext.Current.RewritePath(
string.Concat(
VirtualPath,
"?campaign=" + code));
}
var page = BuildManager.CreateInstanceFromVirtualPath
(VirtualPath, typeof(Page)) as IHttpHandler;
return page;
}
但是我注意到在我现有的aspx页面上有太多的东西要改变(即链接到javascript,链接到css文件)。
所以我在想如果有一种方法可以保留上面的代码,但最后不是重写,只需要执行Request.Redirect或Server.Transfer来最小化所需的更改。因此,在第一个条目中使用System.Web.Routing的目的仅仅是为了URL友好。
如何忽略除代码中指定的其他模式?
感谢。
答案 0 :(得分:1)
建议不要使用重写与ASP.NET URL Routing一起使用,因为ASP.NET URL Routing的某些实现也在内部使用重写(它取决于ASP.NET的版本)。使用重写的两个不同组件的组合可能会导致冲突(虽然我不能100%确定这就是你看到这个问题的原因)。
关于使用转移/重定向/重写:
我最强烈的建议是不要使用它们中的任何一个!不要重定向(或其他任何东西),而是让ASP.NET直接从IRouteHandler返回页面来调用页面,就像你已经在做的那样(只是没有调用Rewrite)。只要您的IRouteHandler
在某处保存RouteData
,页面就可以从路线中获取数据,您应该很高兴。
查看Phil Haack's Web Form routing sample以查看如何保存路线数据的示例(或只使用他的代码!)。
关于忽略模式:
您可以使用IRouteConstraint来约束哪些网址与您的路线相匹配。有一个使用正则表达式的内置默认路由约束实现,但您也可以编写自定义路由约束。这是一个例子:
Route r = new Route(...);
r.Constraints = new RouteValueDictionary(new {
campaign_code = "\d{5}", // constrain to 5-digit numbers only
other_value = new CustomRouteConstraint(), // call custom constraint
});
CustomRouteConstraint是一个可以编写的类,它派生自IRouteConstraint
。
我应该注意的一件事是静态文件,例如CSS和JPG文件,默认情况下它们总是从路由中排除。默认情况下,路由忽略与磁盘上的物理文件完全匹配的模式。您可以通过设置RouteTable.Routes.RouteExistingFiles = true
来更改此行为,但这不是默认设置。