【问题标题】:Regarding URL Re-write using routing concept关于使用路由概念重写 URL
【发布时间】:2011-09-01 17:52:28
【问题描述】:

如果可能的话,请为我提供实现 url 路由的代码。假设我的页面中有两个网址,例如

第一个


www.mysite.com/101/category.aspx

所以我希望当用户点击上面的网址时,请求应该像

www.mysite.com/category.aspx?id=101 但是

www.mysite.com/101/category.aspx 这个 url 应该显示在 addressba 中。

当任何用户直接输入像 www.mysite.com/category.aspx?id=101 这样的 url 时,不会发生路由,而是应该处理上面的 url 和

www.mysite.com/category.aspx?id=101 此网址应显示在地址栏中。

第二个


www.mysite.com/audi/product.aspx

所以我希望当用户点击上面的网址时,请求应该像

www.mysite.com/product.aspx?cat=audi 但是

www.mysite.com/audi/product.aspx 此网址应显示在地址栏中。

当任何用户直接输入像 www.mysite.com/product.aspx?cat=audi 这样的 url 时,不会发生路由,而是应该处理上面的 url 并且

www.mysite.com/product.aspx?cat=audi 此网址应显示在地址栏中。

我从未使用过 url 路由....所以请在编码方面指导我。谢谢

【问题讨论】:

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


    【解决方案1】:

    在使用 IIS7 rewrite module 的 ASP.NET 中,您将使用如下内容:

    <rewrite>
      <rules>
        <rule name="Rewrite to category.aspx">
          <match url="^([0-9]+)/category.aspx" />
          <action type="Rewrite" url="category.aspx?id={R:1}" />
        </rule>
        <rule name="Rewrite to product.aspx">
          <match url="^(.*)/product.aspx" />
          <action type="Rewrite" url="product.aspx?cat={R:1}" />
        </rule>
      </rules>
    </rewrite>
    

    更新 意识到你不能像我最初展示的那样将路由变量作为querystringMapPageRoute 传递。事实上,如果你想这样做,事情就会变得棘手。我能想到的有 2 个选项。

    选项 1)

    使用以下路线。

    routes.MapPageRoute(
       "category",
       "{category}/category.aspx",
       "category.aspx"
    );
    

    然后在您的category.aspx 中使用以下代码而不是querystring 来提取类别值。

    ControllerContext.RouteData.Values["category"];
    

    选项 2)

    这涉及创建自定义处理程序,以便在重写路径时将 RouteData 重写为 querystring

    public class PageRouteWithQueryStringHandler : PageRouteHandler
    {
        public RouteWithQueryHandler(string virtualPath, bool checkPhysicalUrlAccess)
            : base(virtualPath, checkPhysicalUrlAccess)
        {
        }
    
        public RouteWithQueryHandler(string virtualPath)
            :base(virtualPath)
        {
        }
    
        public override IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            var request = requestContext.HttpContext.Request;
            var query  = HttpUtility.ParseQueryString(request.Url.Query);
            foreach (var keyPair in requestContext.RouteData.Values)
            {
                query[HttpUtility.UrlEncode(keyPair.Key)] = HttpUtility.UrlEncode(
                                                   Convert.ToString(keyPair.Value));
            }
            var qs = string.Join("&", query);
            requestContext.HttpContext.RewritePath(
                                 requestContext.HttpContext.Request.Path, null, qs);
            return base.GetHttpHandler(requestContext);
        }
    }
    

    这可以注册如下。

    routes.Add("category", new Route("{category}/category.aspx",     
               new PageRouteWithQueryStringHandler ("~/category.aspx", true)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      相关资源
      最近更新 更多