2010-08-24 3 views
8

Ho il seguente percorso definito:Perché GetVirtualPath non riuscendo dopo l'aggiornamento 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", ""); 

E il seguente codice di controllo:

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" 

} 

Perché questo codice di ritorno di un percorso in .NET 3.5 e non in .NET 4.0?

+0

uno dei metodi che si chiama è stato aggiornato per contenere i nuovi parametri facoltativi in ​​.net 4? Ho visto questo causare problemi in quanto cambia il modo in cui funziona il binding. – GreyCloud

+0

Yerp qualcosa è cambiato con il processo di associazione. Ho notato che funziona quando ho solo un parametro opzionale. Non sto usando il nuovo .net 4 params opzionale –

+2

Questo sembra essere un leggero cambiamento di rottura. Ci sto guardando e seguirò. – Haacked

risposta

1

Perché stai miscelando a e con Controller e Action nel percorso? Dato che il motore di routing richiede il numero Controller e il numero, suggerisco di seguirli. Il seguente esempio funziona:

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