2010-08-24 9 views
8

He definido la siguiente ruta:GetVirtualPath fallar después de actualizar a .NET 4

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", ""); 

Y el siguiente código de controlador:

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" 

} 

¿Por qué este código de retorno de una ruta en .NET 3.5 y no en .NET 4.0?

+0

¿Alguno de los métodos que está llamando se actualizó para contener los nuevos parámetros opcionales en .net 4? He visto esto causar problemas ya que cambia la forma en que funciona el enlace. – GreyCloud

+0

Yerp algo cambió con el proceso de enlace. Noto que esto funciona cuando solo tengo un parámetro opcional. No estoy usando el nuevo .net 4 parámetros opcionales –

+2

Esto parece ser un ligero cambio de última hora. Estoy investigando y haré un seguimiento. – Haacked

Respuesta

1

¿Por qué está mezclando a y b con Controller y Action en su ruta? Como el motor de enrutamiento requiere Controller y Action, le sugiero que se quede con ellos. El siguiente ejemplo funciona:

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". 
} 
Cuestiones relacionadas