首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用System.Web.Routing在网页表单中不重写URL?

如何使用System.Web.Routing在网页表单中不重写URL?
EN

Stack Overflow用户
提问于 2010-01-12 04:57:07
回答 1查看 2.4K关注 0票数 0

我使用的是System.Web.Routing和ASP.NET (3.5)网络表单,这些表单将从

  • http://www.myurl.com/campaign/abc

  • http://www.myurl.com/default.aspx?campaign=abc

守则如下:

代码语言:javascript
复制
public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add("CampaignRoute", new Route
                                    (
                                    "{campaign_code}",
                                    new CustomRouteHandler("~/default.aspx")
                                    ));
}

IRouteHandler实现:

代码语言:javascript
复制
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. 如何忽略代码中指定的其他模式?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-12 06:15:02

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

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

我最强烈的建议是不要使用它们中的任何一个!与其重定向(或其他任何东西),只需让ASP.NET直接调用页面,从IRouteHandler返回它,就像您已经在做的那样(只是不调用重写)。只要您的IRouteHandlerRouteData保存在某个地方,页面就可以从路由中获取数据,您应该可以选择。

看看菲尔·哈克的Web表单路由示例,看看如何保存路由数据(或者只使用他的代码!)。

关于忽略模式:

您可以使用IRouteConstraint来约束哪个URL与您的路由匹配。有一个内置的默认路由约束实现,它使用正则表达式,但也可以编写自定义路由约束。下面是一个示例:

代码语言:javascript
复制
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来更改此行为,但这不是默认的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2046792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档