关于使用路由概念的URL重写

时间:2011-09-01 17:52:29

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

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

第一个


www.mysite.com/101/category.aspx

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

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

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

当任何用户直接输入网址时,例如www.mysite.com/category.aspx?id=101,则不会发生任何路由,而是上面的网址应处理并

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,则不会发生任何路由,而是上面的网址应处理并

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

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

1 个答案:

答案 0 :(得分: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>

已更新已意识到您无法将路由变量作为querystring传递给MapPageRoute,正如我最初展示的那样。事实上,如果你想这样做,事情会变得棘手。我能想到的有两种选择。

选项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)));