我使用的是System.Web.Routing和ASP.NET (3.5)网络表单,这些表单将从
至
守则如下:
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文件的链接)。
谢谢。
发布于 2010-01-12 06:15:02
不建议将重写与ASP.NET URL路由结合使用,因为ASP.NET URL路由的某些实现内部也使用重写(这取决于ASP.NET的版本)。使用重写的两个不同组件的组合可能会导致冲突(尽管我不能100%肯定这就是您看到这个问题的原因)。
关于使用传输/重定向/重写:
我最强烈的建议是不要使用它们中的任何一个!与其重定向(或其他任何东西),只需让ASP.NET直接调用页面,从IRouteHandler返回它,就像您已经在做的那样(只是不调用重写)。只要您的IRouteHandler将RouteData保存在某个地方,页面就可以从路由中获取数据,您应该可以选择。
看看菲尔·哈克的Web表单路由示例,看看如何保存路由数据(或者只使用他的代码!)。
关于忽略模式:
您可以使用IRouteConstraint来约束哪个URL与您的路由匹配。有一个内置的默认路由约束实现,它使用正则表达式,但也可以编写自定义路由约束。下面是一个示例:
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来更改此行为,但这不是默认的。
https://stackoverflow.com/questions/2046792
复制相似问题