如何使用System.Web.Routing不在Web窗体中重写URL?

时间:2010-01-12 04:57:07

标签: asp.net webforms url-rewriting url-routing

我正在使用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文件)。

  1. 所以我在想如果有一种方法可以保留上面的代码,但最后不是重写,只需要执行Request.Redirect或Server.Transfer来最小化所需的更改。因此,在第一个条目中使用System.Web.Routing的目的仅仅是为了URL友好。

  2. 如何忽略除代码中指定的其他模式?

  3. 感谢。

1 个答案:

答案 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来更改此行为,但这不是默认设置。