Почему сбой GetVirtualPath после обновления до .NET 4 - PullRequest
8 голосов
/ 24 августа 2010

У меня определен следующий маршрут:

 var route = new Route("{id}/{a}/{b}", new MvcRouteHandler());
 route.Defaults = new RouteValueDictionary(new { controller = "Home", action = "Show" });
 route.Defaults.Add("a", "");
 route.Defaults.Add("b", "");

И следующий код контроллера:

public ActionResult Show(int id)
{
    RouteValueDictionary routeValues = new RouteValueDictionary();
    routeValues["Controller"] = "Home";
    routeValues["Action"] = "Show";
    routeValues["id"] = 1;
    var requestContext = new RequestContext(this.HttpContext, RouteData);
    var rv = route.GetVirtualPath(requestContext, routeValues);
    // when targetting .NET 4 rv is null, when its 3.5 it is "/1"

 }

Почему этот код возвращает маршрут в .NET 3.5, а не в .NET 4.0?

1 Ответ

1 голос
/ 24 августа 2010

Почему вы смешиваете a и b с Controller и Action в вашем маршруте? Поскольку Controller и Action требуются механизмом маршрутизации, я предлагаю вам придерживаться их. Работает следующий пример:

var route = new Route("{Id}/{Controller}/{Action}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary
  {
    { "Id", "" },
    { "Controller", "Home" },
    { "Action", "Show" },
  }
};

ActionResult Show(int id)
{
  RouteValueDictionary routeValues = new RouteValueDictionary();
  routeValues["Controller"] = "Home";
  routeValues["Action"] = "Show";
  routeValues["Id"] = 1;
  var requestContext = new RequestContext(this.HttpContext, RouteData);
  var rv = route.GetVirtualPath(requestContext, routeValues);
  // rv.VirtualPath == "1".
}
...