如果可能的话,请提供实施网址路由的代码。假设我的页面中有两个网址,如
第一个
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路由....所以请在编码方面指导我。感谢
答案 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)));