2009-04-23 11 views
39

Ho la seguente ActionLink a mio avvisoasp.net Html.ActionLink MVC() mantenendo il valore percorso Non voglio

<%= Html.ActionLink("LinkText", "Action", "Controller"); %> 

e crea il seguente URL http://mywebsite.com/Controller/Action

Dire aggiungo un ID alla fine in questo modo: http://mywebsite.com/Controller/Action/53 e vai alla pagina. In questa pagina ho il markup che ho specificato sopra. Ora, quando guardo l'URL crea sembra che questo:

http://mywebsite.com/Controller/Action/53 (notare l'aggiunta del ID)

Ma io voglio per rimuovere l'ID e guardare come ha fatto in origine, come questo http://mywebsite.com/Controller/Action (avviso nessun ID qui)

Qualche idea su come posso risolvere questo problema? Non voglio usare URL hard coded poiché il mio controller/azioni potrebbero cambiare.

+1

Vedere [questo workitem] (https://aspnetwebstack.codeplex.com/workitem/1346) per la spiegazione ufficiale di Microsoft di questo problema e soluzioni alternative. – NightOwl888

risposta

40

La soluzione è specificare i miei valori di percorso (il terzo parametro di seguito)

<%= Html.ActionLink("LinkText", "Action", "Controller", 
    new { id=string.Empty }, null) %> 
+0

Grazie per questa risposta, ne avevo bisogno per un'altra circostanza, ma hai centrato il punto giusto sulla testa con quel nulla finale! –

+0

Questo sembra un po 'imbarazzante ... Ho bisogno di fare la stessa cosa ma penso che potrei dover creare un nuovo metodo di estensione come Arnis L postato sotto –

+1

Anche questo sembra che la funzionalità dovrebbe essere integrata nel framework dal momento che questo la situazione si presenta spesso. Ad esempio, avendo un menu, non vuoi che il link del menu contenga tutti i parametri, solo l'azione –

9

Il problema è che i metodi incorporati prendono input dall'URL in cui ci si trova attualmente e da ciò che si fornisce. Si può provare questo:

<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %> 

Questo dovrebbe cancellare manualmente il parametro id.

4

Non so perché, ma non ha funzionato per me (forse a causa della MVC2 RC). Metodo Creato UrlHelper =>

public static string 
      WithoutRouteValues(this UrlHelper helper, ActionResult action,params string[] routeValues) 
     { 
      var rv = helper.RequestContext.RouteData.Values; 
      var ignoredValues = rv.Where(x=>routeValues.Any(z => z == x.Key)).ToList(); 
      foreach (var ignoredValue in ignoredValues) 
       rv.Remove(ignoredValue.Key); 
      var res = helper.Action(action); 
      foreach (var ignoredValue in ignoredValues) 
       rv.Add(ignoredValue.Key, ignoredValue.Value); 
      return res; 
     } 
+0

Ho avuto lo stesso problema (utilizzando MVC2 RTM). Avevo un valore di instradamento chiamato 'plan' e l'ultima (predefinita) route l'ha aggiunto come'? Plan = X'. Quindi ho aggiunto il valore predefinito all'ultima route (predefinita) per il mio valore di rotta 'plan' come' plan = string.Empty'. Anche se la definizione del percorso non definisce la variabile del segmento URL chiamata 'plan'. Finché ha funzionato, ci sto bene. –

+0

Ho usato una variazione di questo per risolvere in modo affidabile ed elegante questo problema. –

12

Suona come è necessario registrare un secondo "solo l'azione" percorso e utilizzare Html.RouteLink(). In primo luogo registrare un percorso come questo in te applicazione di avvio:

routes.MapRoute("ActionOnly", "{controller}/{action}", 
    new { controller = "Home", action = "Index" }); 

Poi invece di ActionLink per creare quei collegamenti utilizzano:

Html.RouteLink("About","ActionOnly") 
+0

+1 per l'uso di 'Html.RouteLink()'. Ha funzionato per me - puoi anche specificare routeValues ​​in modo che MVC perda l'azione corrente e ritorni all'indice o qualcosa del genere, ad es. '@ Html.RouteLink (" Annulla "," ThisSection_default ", new {action =" Index "})'. – Jez

2

Un altro modo è quello di utilizzare ActionLink (HtmlHelper, String, String, RouteValueDictionary) di sovraccarico, poi ci sono non c'è bisogno di mettere nulla nell'ultimo parametro

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %> 
4

Se uno non si sa quali valori devono essere sovrascritto esplicitamente o si vogliono solo un annullare l'elenco di parametri aggiuntivi è possibile utilizzare un metodo di estensione come il seguente.

<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a> 

I dettagli di implementazione sono in this blog post

+0

Pulito e semplice, molto bello +1 –

+1

È un trucco sporco ... ma è ancora la soluzione migliore che ho trovato finora. –

0

mi serviva il mio link di menu per essere dinamico. Piuttosto che implementare un sacco di codice in più e il routing per ogni singola pagina ho semplicemente dispensato l'helper HTML.

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a> 
4

Ho impostato esplicitamente il nome dell'azione come "Azione /". Sembra un po 'come un trucco, ma è una soluzione rapida.

@Html.ActionLink("Link Name", "Action/", "Controller") 
+0

Ho dovuto fare anche questo, il link doveva indicizzare, quindi ero in grado di usare solo "/" come azione. @ Html.ActionLink ("Nome collegamento", "/", "Controller") – Derrick

0

Gli overload di Html.ActionLink vengono modificati nelle versioni successive di MVC.In MVC 5 e versioni successive. Ecco come fare:

@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null) 

Nota Ho passato "" per il parametro id e null per HTMLATTRIBUTES.

Problemi correlati