Asp.net 如何使用System.Web.Routing在Web表单中不重写URL?

Asp.net 如何使用System.Web.Routing在Web表单中不重写URL?,asp.net,webforms,url-rewriting,url-routing,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 (

我将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友好

  • 如何忽略代码中指定之外的其他模式


  • 谢谢。

    不建议将重写与ASP.NET URL路由结合使用,因为ASP.NET URL路由的某些实现在内部也使用重写(这取决于ASP.NET的版本)。使用重写的两个不同组件的组合可能会导致冲突(尽管我不能100%确定这就是为什么您会看到这个问题)

    关于使用传输/重定向/重写:

    我最强烈的建议是不要使用它们!与重定向(或其他任何操作)不同,只需让ASP.NET通过从iroutHandler返回页面来直接调用页面,就像您已经在做的那样(只是不需要调用重写)。只要您的
    IRouteHandler
    routedData
    保存在某个地方,页面就可以从路由中获取数据,您就可以开始了

    请看一个如何保存路由数据的示例(或者只使用他的代码!)

    关于忽略模式:

    您可以使用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是一个可以编写派生自的类


    关于CSS和JPG等静态文件,我应该注意的一点是,默认情况下,它们总是被排除在路由之外。默认情况下,路由将忽略与磁盘上的物理文件完全匹配的模式。您可以通过设置
    RouteTable.Routes.RouteExistingFiles=true来更改此行为,但这不是默认设置。

    我可以问一下URL重写和URL路由之间的区别吗?抱歉,如果我在这里是个白痴,但我真的不知道。ASP.NET意义上的URL重写是一个中间步骤,可以通过更改ASP.NET使用的内部URL来更改当前请求的处理方式。URL路由是一项新功能,它通过直接将incomgin请求映射到IHttpHandler来避免使用URL重写。