2009-11-25 13 views

risposta

12

Si dovrebbe costruire correttamente i percorsi nella tabella del percorso. Ad esempio .:

routes.MapRoute("MyRoute" ,"{controler}/{id}#{detail}" ,new { controller = "users", action = "index", id = (string)null, detail = "Summary" }); 
0

Faccio qualcosa del genere sul mio sito here. Ma non è con RedirectToRouteResult. RedirectToRouteResult non supporta l'inclusione di una parte di ancoraggio nell'URL.

È necessario creare il collegamento da soli e forse anche la logica per gestire l'elaborazione della parte di ancoraggio, come ho fatto io. La mia applicazione prova a replicare funzionalità simili a quelle delle viste della galleria fotografica di Facebook. Ogni link a una pagina diversa deve avere un URL unico, quindi per questo uso la parte di ancoraggio. Ma perché non traduce direttamente su un percorso devo analizzare manualmente la parte di ancoraggio dell'URL sulla pagina e usare ajax per caricare il contenuto appropriato. Questo è quello che volevo, quindi funziona per me.

+1

Proprio così; So di poter creare un URL da solo, ma desidero beneficiare di verifiche fortemente tipizzate nei miei test unitari quando si asserisce, ad esempio. –

+1

vedo. beh penso che tu sia sfortunato, quindi –

0

Scarica il source code of MVC e verificare come funziona RedirectToRouteResult

Ci possono essere modi migliori, ma una semplice eredità di RedirectToRouteResult e un override di ExecuteResult per consentire una parte facoltativa di ancoraggio dovrebbe risolvere il problema

5

UrlHelper.GenerateUrl include un parametro frammento. Ho creato un metodo di estensione

 public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues) 
     { 
      return UrlHelper.GenerateUrl(
       routeName: null, 
       actionName: actionName, 
       controllerName: controllerName, 
       routeValues: new System.Web.Routing.RouteValueDictionary(routeValues), 
       fragment: fragment, 
       protocol: null, 
       hostName: null, 
       routeCollection: url.RouteCollection, 
       requestContext: url.RequestContext, 
       includeImplicitMvcValues: true /*helps fill in the nulls above*/ 
      ); 
     } 

Poi ho creato una classe RedirectToFragmentResult

public class RedirectToFragmentResult: RedirectResult 
{ 
    public UrlHelper Url {get;set;} 
    public string Action { get; set; } 
    public string Controller { get; set; } 
    public string Fragment { get; set; } 
    public object RouteValues { get; set; } 
    public RedirectToFragmentResult(UrlHelper url, string action, string controller, string fragment, object routeValues) 
     :base(url.Action(action, controller, fragment, routeValues)) 
    { 
     Url = url; 
     Action = action; 
     Controller = controller; 
     Fragment = fragment; 
     RouteValues = routeValues; 
    } 
} 

allora si può solo creare un nuovo RouteValueDictionary (result.RouteValues) nel vostro unit test per controllare il modo in cui si farebbe con un RedirectToRouteResult.

+0

Grazie @Joel Sembra funzionare molto bene. Non è necessario però la proprietà dell'URL locale (che genera un avviso "nasconde"). Ho provato con le linee rimosse: 'UrlHelper Url pubblico {get; set;} 'e' Url = url; '- qualsiasi motivo per cui questo è lì? – Chris

+1

L'ho usato per comodità di debug, quindi posso avere accesso a urlhelper dalla finestra di controllo, ma tu sei corretto su quella base (url.Action è l'ultima volta che viene usato e non è necessario per il test) –

Problemi correlati