2009-06-21 11 views

risposta

2

Can cambi l'URL? Se puoi impostare il parametro {TreePath} come ultimo parametro, puoi farlo facilmente con una rotta. parametro catchall

routes.MapRoute("TreeRoute", 
        "{Action}/{id}/{*TreePath}", 
        new TreeRouteHandler())); 

Il carattere jolly deve essere l'ultimo parametro però.

In caso contrario, penso che si sarà bloccato con dover definire più parametri, uno per abbinare ogni possibile sezione dell'URL TreeMap.

Nota che non puoi mai definire insieme due parametri di instradamento senza un testo letterale tra loro. In altre parole, è possibile definire {Action}/{Id}, ma è possibile mai definire {Action}{Id}. Non è possibile per il motore di routing sapere dove finisce un parametro e quello successivo inizia quando si verifica la corrispondenza del modello.

+0

Immagino che non ci sia altro modo. {Action}/{id}/{* TreePath} non è un URL molto bello. Grazie comunque la parola albero –

13

È possibile creare un gestore di route personalizzato per eseguire questa operazione. Il percorso attuale è un catch-all:

routes.MapRoute(
    "Tree", 
    "Tree/{*path}", 
    new { controller = "Tree", action = "Index" }) 
     .RouteHandler = new TreeRouteHandler(); 

Il gestore albero guarda percorso, estrae l'ultima parte come azione, e poi reindirizza al controller. Anche la parte azione viene rimossa dal percorso. L'aggiunta della parte {id} dovrebbe essere semplice.

public class TreeRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string path = requestContext.RouteData.Values["path"] as string; 

     if (path != null) 
     { 
      int idx = path.LastIndexOf('/'); 
      if (idx >= 0) 
      { 
       string actionName = path.Substring(idx+1); 
       if (actionName.Length > 0) 
       { 
        requestContext.RouteData.Values["action"] = actionName; 
        requestContext.RouteData.Values["path"] = 
         path.Substring(0, idx); 
       } 
      } 
     } 

     return new MvcHandler(requestContext); 
    } 
} 

Il controller funziona allora come ci si aspetterebbe che:

public class TreeController : Controller 
{ 
    public ActionResult DoStuff(string path) 
    { 
     ViewData["path"] = path; 
     return View("Index"); 
    } 
} 

Ora è possibile chiamare URL come /Tree/Node1/Node2/Node3/DoStuff. Il percorso che l'azione ottiene è Node1/Node2/Node3

+0

ha ancora dei rumori, Grazie comunque –

+0

Un gestore di route personalizzato è sicuramente la strada da percorrere se non ti piace il lavoro di Womp. Non è necessario che il controller "tree" sia impostato in modo esplicito come descritto da Chris ... Penso che l'idea di base sia che puoi fare tutto ciò che vuoi con un gestore di route personalizzato. – Charlino

1

Sono nuovo di MVC, ma uno dei requisiti era questa opzione. Sono un vb-er, così ho avuto qualche problema di conversione di codice, ma preso a lavorare un voluto contribuire una soluzione esempio: www.proovit.com/Download/MvcApplication1.zip E 'un semplice progetto standard MVC, ho lasciato il codice e dirs bin fuori, ma puoi copiarli da un progetto standard.

o, è necessario utilizzare il tag app/bla/bla/bla per indice e app/commercio/ordine/visualizzazione per la pagina di ordine.

1

È possibile avere la parte "golosa" all'interno di querystring purché sia ​​possibile avere parti fisse dopo di esso, ad es.

/{*TreePath}/Edit/{id} 
/{*TreePath}/Action/{id} 

noti che l'azione non è variabile nei percorsi sopra perché le parti greedy deve fermarsi ad un certo valore letterale (altro che barra). Lavorerò se eseguirai solo alcune azioni sul tuo "albero" ma sarà ingombrante se avrai molte azioni dal momento che ognuna avrà bisogno della propria voce di percorso.

Non funzionerà immediatamente, ma richiede un percorso personalizzato. Potete trovare una bella scrittura sull'argomento incluso il codice here

Problemi correlati