Маршрут сопоставления с GetVirtualPath - PullRequest
1 голос
/ 21 октября 2010

В моем приложении есть следующая маршрутизация ...

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute(
    "Branding",
    "foo/bar.css",
    new { controller = "DynamicContent", action = "CSS" }
  );

  routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Account", action = "Index", id = UrlParameter.Optional }
  );
}

Я использую Пейджинговый механизм Мартина Боланда , и в итоге он делает следующий вызов:

var virtualPathData = 
  RouteTable.Routes.GetVirtualPath(this.viewContext.RequestContext, pageLinkValueDictionary);

Я подтвердил, что мой контроллер и действие в RequestContext действительны. Но как только этот вызов сделан, virtualPathData ссылается на URL для foo / bar.css. Я подтвердил, что URL-адреса соответствуют правильному контроллеру / действию. Если я закомментирую маршрут выше, оставляя значение по умолчанию, URL-адрес virtualPathData соответствует нужному контроллеру / действию.

Я также пробовал следующую строку и у меня тот же результат.

//var virtualPathData = 
  RouteTable.Routes.GetVirtualPathForArea(this.viewContext.RequestContext, pageLinkValueDictionary);

Может кто-нибудь помочь мне понять, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 23 октября 2010

К сожалению, я думаю, что логика генерации URL не очень хорошо обрабатывает статические URL.Я считаю, что вы можете сделать следующее:

rout.MapRoute ("Брендинг", "{controller} /bar.css", new {controller = "DynamicContent", action = "CSS"}, new {controller = "foo"});

Попробуйте это.

1 голос
/ 22 октября 2010

Я все еще не совсем уверен, почему я видел поведение выше, поэтому, если кто-то хочет присоединиться к своим идеям, не стесняйтесь.

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

routes.MapRoute(
  "Default",
  "{controller}/{action}/{id}",
  new { controller = "Account", action = "Index", id = UrlParameter.Optional },
  new { controller = new NotEqual("DynamicContent") }
);

routes.MapRoute(
  "Branding",
  "foo/bar.css",
  new { controller = "DynamicContent", action = "CSS" }
);

Для тех, кому интересно, что такое NotEqualЯ нашел это в блоге .

public class NotEqual : IRouteConstraint
{
  private string _match = string.Empty;

  public NotEqual(string match)
  {
    _match = match;
  }

  public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
  {
    return String.Compare(values[parameterName].ToString(), _match, true) != 0; 
  }
}

Я, конечно, слышу о лучших способах сделать это ИЛИ, почему мой оригинальный код не работал полностью.

...