asp.net mvc Html.ActionLink () mantenendo il valore del percorso che non desidero

Ho il seguente ActionLink secondo me

 

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

Supponiamo che 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 che crea, assomiglia a questo:

http://mywebsite.com/Controller/Action/53 (notare l’aggiunta dell’ID)

Ma voglio rimuovere l’ID e apparire come originariamente, come questo http://mywebsite.com/Controller/Action (non notare alcun ID qui)

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

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

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

Sembra che sia necessario registrare una seconda route “Solo azione” e utilizzare Html.RouteLink (). Prima registra una rotta come questa nell’avvio dell’applicazione:

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

Quindi, invece di ActionLink per creare questi collegamenti utilizzare:

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

Il problema è che i metodi incorporati prendono input dall’URL attualmente in uso e da ciò che fornisci. Potresti provare questo:

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

Questo dovrebbe cancellare manualmente il parametro id.

Non so perché, ma non ha funzionato per me (forse a causa di Mvc2 RC). Creato il metodo 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; } 

Se non si conosce quali valori devono essere esplicitamente ignorati o se si desidera semplicemente evitare l’elenco di parametri aggiuntivi, è ansible utilizzare un metodo di estensione come il seguente.

 View 

I dettagli di implementazione sono in questo post del blog

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

Un altro modo è utilizzare l’overload di ActionLink (HtmlHelper, String, String, RouteValueDictionary), quindi non è necessario inserire null nell’ultimo parametro

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

Avevo bisogno che i miei collegamenti a menu fossero dinamici. Piuttosto che implementare un sacco di codice in più e il routing per ogni singola pagina ho semplicemente dispensato l’helper HTML.

 @item.MenuItemName 

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.