Как использовать Control.GetRouteUrl из класса в App_Code

#.net #asp.net #routing #webforms

#.net #asp.net #маршруты #веб-формы

Вопрос:

Я использую маршрутизацию в asp.net веб-формы 4.0 с некоторым успехом. На своих страницах я использую Page.GetRouteURL для генерации подобных маршрутов.

 <a href = '<%=GetRouteUrl("MyRoute", new {MyFirstRouteValue = "ABC", MySecondRouteValue=123}) #>' >Link Text</a>
  

Это работает отлично, но я обнаружил, что бывают случаи, когда мне нужно иметь эту функциональность в классе в app_code. Я мог бы просто вручную построить маршрут с помощью String.Формат, но это немного неаккуратно, поскольку это дублировало бы код в Global.asax, который определяет маршруты.

Конечно, в классе в App_Code нет объекта Page, поэтому я не могу просто вызвать GetRouteUrl. Просматривая документы на msdn, я вижу кое-что, что выглядит полезным.

Этот метод предусмотрен для удобства кодирования. Это эквивалентно вызову RouteCollection.Метод GetVirtualPath(RequestContext, String, RouteValueDictionary).

Итак, я перешел по документам на эту страницу, в которой указано, что System.Web.Routing.Для GetVirtualPath() требуется System.Web.Routing.Объект RequestContext. Я знаю об объекте HttpContext, но я не могу понять, что такое RequestContext. Кому-нибудь повезло с этим?

Ответ №1:

RequestContext доступен как свойство объекта HttpRequest, поэтому вы можете ссылаться на него как HttpContext.Current.Request.RequestContext . Например,

 public string GetRouteUrl(string routeName, object routeParameters)
{
   var dict = new RouteValueDictionary(routeParameters);
    var data = RouteTable.Routes.GetVirtualPath(HttpContext.Current.Request.RequestContext, routeName, dict );
    if (data != null)
    {
        return data.VirtualPath;
    }
    return null;
}
  

Комментарии:

1. Спасибо Vinay! Это сэкономило мне часы поиска в Google!