Относительно URL Переписать с использованием концепции маршрутизации - PullRequest
0 голосов
/ 01 сентября 2011

если возможно, пожалуйста, предоставьте мне код для реализации URL-маршрутизации.Предположим, у меня есть два URL на моей странице, как

первый


www.mysite.com / 101 / category.aspx

, поэтому я хочу, чтобы когда пользователь нажималпо указанному выше URL-адресу запрос должен выглядеть следующим образом:

www.mysite.com / category.aspx? id = 101, но

www.mysite.com / 101 / category.aspx этот URL должен отображатьсяв addressba.

, когда какой-либо пользователь будет напрямую вводить URL-адрес, например www.mysite.com/category.aspx?id=101, тогда маршрутизация не будет происходить, а выше URL-адреса следует обработать и

www.mysite.com/category.aspx?id=101 этот URL должен отображаться в адресной строке.

второй


www.mysite.com / audi / product.aspx

, поэтому я хочу, чтобы, когда пользователь нажимал на вышеуказанный URL, запрос должен выглядеть следующим образом:

www.mysite.com / product.aspx? Cat = audi, но

www.mysite.com/audi/product.aspx этот URL должен отображаться в адресной строке.

, когда любой пользователь будет напрямую вводить URL, например www.mysite.com/product.aspx?cat=audi, тогда никакая маршрутизация не будет успешнойru Вы должны обработать несколько выше URL-адреса и

www.mysite.com / product.aspx? cat = audi, этот URL-адрес должен отображаться в адресной строке.

У меня никогда не было работы с URL-маршрутизацией .... Так что, пожалуйста, направьте меня с точки зрения кодирования.спасибо

1 Ответ

1 голос
/ 01 сентября 2011

В ASP.NET с использованием модуля перезаписи IIS7 вы бы использовали что-то вроде этого:

<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, как я первоначально показал. На самом деле все становится сложнее, если вы хотите это сделать. Есть 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)));
...